Création d’un élément de tâche récurrente simple
S’applique à : Outlook 2013 | Outlook 2016
MAPI peut être utilisé pour créer des éléments de tâche. Cette rubrique explique comment créer un élément de tâche récurrent simple.
Pour plus d’informations sur le téléchargement, l’affichage et l’exécution du code à partir de l’application MFCMAPI et du projet CreateOutlookItemsAddin référencé dans cette rubrique, consultez Installer les exemples utilisés dans cette section.
Pour créer un élément de tâche
Ouvrez une banque de messages. Pour plus d’informations sur l’ouverture d’une banque de messages, consultez Ouverture d’une banque de messages.
Ouvrez le dossier Tâches dans la banque de messages. Pour plus d’informations, consultez PR_IPM_TASK_ENTRYID (PidTagIpmTaskEntryId).
Appelez la méthode IMAPIFolder ::CreateMessage dans le dossier Tasks pour créer l’élément de tâche.
Définissez la propriété dispidTaskRecur (PidLidTaskRecurrence) et les autres propriétés liées aux tâches requises pour créer une tâche récurrente.
Enregistrez le nouvel élément de tâche.
La AddTask
fonction dans le fichier source Tasks.cpp du projet CreateOutlookItemsAddin illustre ces étapes. La AddTask
fonction prend les paramètres de la boîte de dialogue Ajouter une tâche qui s’affiche lorsque vous cliquez sur Ajouter une tâche dans le menu Addins de l’exemple d’application MFCMAPI. La DisplayAddTaskDialog
fonction dans Tasks.cpp affiche la boîte de dialogue et transmet les valeurs de la boîte de dialogue à la AddTask
fonction . La DisplayAddTaskDialog
fonction n’est pas directement liée à la création d’un élément de tâche à l’aide de MAPI. Elle n’est donc pas répertoriée ici.
Importante
Le code de l’application MFCMAPI ne garantit pas que le dossier Tâches a été sélectionné lorsque vous cliquez sur la commande Ajouter une tâche dans le menu Add Add. La création d’éléments de tâche dans un dossier autre que le dossier Tâches peut entraîner un comportement non défini. Vérifiez que vous avez sélectionné le dossier Tâches avant d’utiliser la commande Ajouter une tâche dans l’application MFCMAPI.
La AddTask
fonction est répertoriée ci-dessous. Notez que le paramètre lpFolder passé à la AddTask
fonction est un pointeur vers une interface IMAPIFolder qui représente le dossier dans lequel la nouvelle tâche est créée. Étant donné lpFolder qui représente une interface IMAPIFolder , le code appelle la méthode IMAPIFolder ::CreateMessage . La méthode CreateMessage retourne un code de réussite et un pointeur vers un pointeur vers une interface IMessage . La plupart du code de la AddTask
fonction gère le travail de spécification des propriétés en préparation de l’appel de la méthode IMAPIProp ::SetProps . Si l’appel à la méthode SetProps réussit, la méthode IMAPIProp ::SaveChanges est appelée pour valider les modifications apportées au magasin et créer un élément de tâche.
La AddTask
fonction définit un certain nombre de propriétés nommées. Pour plus d’informations sur les propriétés nommées et la façon dont elles sont créées, voir Utilisation de MAPI pour créer des éléments Outlook 2007. Étant donné que les propriétés nommées utilisées pour les éléments de tâche occupent plusieurs jeux de propriétés, vous devez faire attention lors de la génération des paramètres à passer à la méthode IMAPIProp ::GetIDsFromNames .
La AddTask
fonction utilise la BuildWeeklyTaskRecurrencePattern
fonction d’assistance pour générer une structure représentant une périodicité de tâche pour définir la propriété dispidTaskRecur . Pour plus d’informations sur la structure de périodicité de tâche générée par la BuildWeeklyTaskRecurrencePattern
fonction, consultez Propriété canonique PidLidTaskRecurrence et Propriété canonique PidLidRecurrencePattern.
Notez que bien qu’une grande variété de modèles de périodicité soit possible, la BuildWeeklyTaskRecurrencePattern
fonction génère uniquement un modèle de périodicité hebdomadaire. Il est également codé en dur pour un certain nombre d’hypothèses, telles que le type de calendrier (grégorien), le premier jour de la semaine (dimanche) et le nombre d’instances modifiées ou supprimées (aucune). Une fonction de création de modèle de périodicité à usage plus général doit accepter ces types de variables en tant que paramètres.
Voici la liste complète de la AddTask
fonction.
HRESULT AddTask(LPMAPIFOLDER lpFolder,
SYSTEMTIME* lpstStart, // PidLidCommonEnd, PidLidTaskDueDate, PidLidTaskRecurrence
SYSTEMTIME* lpstEnd, // PidLidTaskRecurrence
SYSTEMTIME* lpstFirstDOW, // PidLidTaskRecurrence
DWORD dwPeriod, // PidLidTaskRecurrence
DWORD dwOccurrenceCount, // PidLidTaskRecurrence
DWORD dwPatternTypeSpecific, // PidLidTaskRecurrence
LPWSTR szSubject, // PR_SUBJECT_W
LPWSTR szBody) // PR_BODY_W
{
if (!lpFolder) return MAPI_E_INVALID_PARAMETER;
HRESULT hRes = S_OK;
LPMESSAGE lpMessage = 0;
// create a message and set its properties
hRes = lpFolder->CreateMessage(0,
0,
&lpMessage);
if (SUCCEEDED(hRes))
{
MAPINAMEID rgnmid[ulTaskProps];
LPMAPINAMEID rgpnmid[ulTaskProps];
LPSPropTagArray lpNamedPropTags = NULL;
ULONG i = 0;
for (i = 0 ; i < ulTaskProps ; i++)
{
if (i < ulFirstTaskProp)
rgnmid[i].lpguid = (LPGUID)&PSETID_Common;
else
rgnmid[i].lpguid = (LPGUID)&PSETID_Task;
rgnmid[i].ulKind = MNID_ID;
rgnmid[i].Kind.lID = aulTaskProps[i];
rgpnmid[i] = &rgnmid[i];
}
hRes = lpFolder->GetIDsFromNames(
ulTaskProps,
(LPMAPINAMEID*) &rgpnmid,
NULL,
&lpNamedPropTags);
if (SUCCEEDED(hRes) && lpNamedPropTags)
{
// Because the properties to be set are known in advance,
// most of the structures involved can be statically declared
// to minimize expensive MAPIAllocateBuffer calls.
SPropValue spvProps[NUM_PROPS] = {0};
spvProps[p_PidLidTaskMode].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskMode],PT_LONG);
spvProps[p_PidLidCommonEnd].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidCommonEnd],PT_SYSTIME);
spvProps[p_PidLidTaskStatus].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskStatus],PT_LONG);
spvProps[p_PidLidPercentComplete].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidPercentComplete],PT_DOUBLE);
spvProps[p_PidLidTaskState].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskState],PT_LONG);
spvProps[p_PidLidTaskRecurrence].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskRecurrence],PT_BINARY);
spvProps[p_PidLidTaskDeadOccurrence].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskDeadOccurrence],PT_BOOLEAN);
spvProps[p_PidLidTaskOwner].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskOwner],PT_UNICODE);
spvProps[p_PidLidTaskFRecurring].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskFRecurring],PT_BOOLEAN);
spvProps[p_PidLidTaskOwnership].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskOwnership],PT_LONG);
spvProps[p_PidLidTaskAcceptanceState].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskAcceptanceState],PT_LONG);
spvProps[p_PidLidTaskFFixOffline].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskFFixOffline],PT_BOOLEAN);
spvProps[p_PidLidTaskDueDate].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskDueDate],PT_SYSTIME);
spvProps[p_PidLidTaskComplete].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskComplete],PT_SYSTIME);
spvProps[p_PR_MESSAGE_CLASS_W].ulPropTag = PR_MESSAGE_CLASS_W;
spvProps[p_PR_ICON_INDEX].ulPropTag = PR_ICON_INDEX;
spvProps[p_PR_SUBJECT_W].ulPropTag = PR_SUBJECT_W;
spvProps[p_PR_MESSAGE_FLAGS].ulPropTag = PR_MESSAGE_FLAGS;
spvProps[p_PR_BODY_W].ulPropTag = PR_BODY_W;
spvProps[p_PidLidTaskMode].Value.l = tdmtNothing;
SYSTEMTIME stStartUTC = {0};
TzSpecificLocalTimeToSystemTime(NULL,lpstStart,&stStartUTC);
SystemTimeToFileTime(&stStartUTC,&spvProps[p_PidLidCommonEnd].Value.ft);
spvProps[p_PidLidTaskStatus].Value.l = tsvNotStarted;
spvProps[p_PidLidPercentComplete].Value.dbl = 0.0;
spvProps[p_PidLidTaskState].Value.l = tdsOWNNEW;
spvProps[p_PidLidTaskDeadOccurrence].Value.b = false;
spvProps[p_PidLidTaskOwner].Value.lpszW = L"Unknown";
spvProps[p_PidLidTaskFRecurring].Value.b = true;
spvProps[p_PidLidTaskOwnership].Value.l = tovNew;
spvProps[p_PidLidTaskAcceptanceState].Value.l = tdvNone;
spvProps[p_PidLidTaskFFixOffline].Value.b = true;
SystemTimeToFileTime(lpstStart,&spvProps[p_PidLidTaskDueDate].Value.ft);
spvProps[p_PidLidTaskComplete].Value.b = false;
spvProps[p_PR_MESSAGE_CLASS_W].Value.lpszW = L"IPM.Task";
spvProps[p_PR_ICON_INDEX].Value.l = 0x501; // Unassigned Recurring Task
spvProps[p_PR_SUBJECT_W].Value.lpszW = szSubject;
spvProps[p_PR_MESSAGE_FLAGS].Value.l = MSGFLAG_READ;
spvProps[p_PR_BODY_W].Value.lpszW = szBody;
hRes = BuildWeeklyTaskRecurrencePattern(
lpstStart,
lpstEnd,
lpstFirstDOW,
dwPeriod,
dwOccurrenceCount,
dwPatternTypeSpecific,
&spvProps[p_PidLidTaskRecurrence].Value.bin.cb,
&spvProps[p_PidLidTaskRecurrence].Value.bin.lpb);
if (SUCCEEDED(hRes))
{
hRes = lpMessage->SetProps(NUM_PROPS, spvProps, NULL);
if (SUCCEEDED(hRes))
{
hRes = lpMessage->SaveChanges(FORCE_SAVE);
}
}
if (spvProps[p_PidLidTaskRecurrence].Value.bin.lpb)
delete[] spvProps[p_PidLidTaskRecurrence].Value.bin.lpb;
}
MAPIFreeBuffer(lpNamedPropTags);
}
if (lpMessage) lpMessage->Release();
return hRes;
}