bonjour,
j'utilise TrackPopupMenu sur notification de clic droit avec une listview...
cela fonctionne parfaitement si aucun message n'arrive à la listview pendant l'affichage
du menu, puisque TrackPopupMenu bloque le retour de la notification.
seulement j'ai un thread qui met à jour cette listview... alors le menu s'affiche vide et plus rien, l'application ne répond plus.
j'ai donc mis TrackPopupMenu dans un thread et à chaque notification je fais un SetEvent
pour le débloquer.
le problème, c'est que le menu ne s'affiche plus.
le handle du menu (menu en ressource) qui est récupéré avec LoadMenu et GetSubMenu est valide.
TrackPopupMenu retourne de suite la valeur 0, et GetLastError renvoie 0.
j'ai mis les flags TPM_NONOTIFY | TPM_RETURNCMD, et pour le hwnd c'est le handle de la fenêtre principale.
avec NULL pour hwnd, il y a bien une erreur handle invalide...
j'ai aussi testé le handle du thread, mais le retour est toujours 0 et GetLastError renvoie aussi 0
la seule chose trouvée sur le net, c'est d'ajouter
SetForegroundWindow(hwnd);
avant et
PostMessage(hwnd, WM_NULL, 0, 0);
après TrackPopupMenu.
mais cela ne change rien... jai même ajouté une boucle de message :
DWORD WINAPI ThreadMenu(LPVOID lpParam)
{
int iRet;
DWORD dwErr;
sg_tabEvents[0] = g_hExitEvent; // event EXIT
sg_tabEvents[1] = g_hMenuEvent; // event MENU
sg_hmenu = LoadMenu(g_hinst,"MENURES"); // chargement menu en ressource
sg_hsub = GetSubMenu(sg_hmenu, 0);
while (1) // MSDN -> Waiting in a Message Loop
{
DWORD result ;
MSG msg ;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT) return 1;
DispatchMessage(&msg);
}
result = MsgWaitForMultipleObjects(2, sg_tabEvents, FALSE, INFINITE, QS_ALLINPUT);
if (result == (WAIT_OBJECT_0 + 2)) continue;
else
{
if(!(result - WAIT_OBJECT_0)) return 0; // sortie sur event EXIT
ResetEvent(g_hMenuEvent); // reset event MENU
iRet = TrackPopupMenu(sg_hsub, TPM_NONOTIFY | TPM_RETURNCMD | TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON,
g_x + g_stNotify.x, g_y + g_stNotify.y, 0, g_hwnd, NULL);
if(!iRet){ dwErr = GetLastError(); AffErrMess(dwErr); continue; } // affichage message erreur
// ici traitement retour TrackPopupMenu
continue;
}
}
}
même avec un menu créer dans le thread, TrackPopupMenu renvoie 0, et GetLastError
infique toujours aucune erreur
peut-être que je fais fausse route :(
vraiment merci si quelqu'un a une solution, ou même une idée pour faire autrement.