2010-08-23 8 views
4

En ce qui concerne:La fonction PeekMessage en C++ et nommés tuyaux

PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) 

Si hWnd est NULL, PeekMessage récupère messages pour une fenêtre qui appartient au thread courant, et tout messages sur ce thread en cours file d'attente de messages dont la valeur hwnd est NULL (voir la structure MSG). Par conséquent si hWnd est NULL, les messages de fenêtre et les messages de fil sont traités.

Ce sont des messages reçus par un tube nommé inclus dans messages de fenêtre et messages de fil?

+1

Je ne pense pas. vous auriez besoin de faire ReadFile ou l'équivalent. – obelix

Répondre

2

Certainement pas. Les canaux nommés n'envoient pas de messages de fenêtre.

Les messages de thread dans ce contexte sont spéciaux et n'ont rien à voir avec les canaux nommés. À la place, utilisez MsgWaitForMultipleObjects.

CODE EXEMPLE:

void MessageLoop(HANDLE hNamedPipe) 
{ 
    do { 
     DWORD res = MsgWaitForMultipleObjects(1, &hNamedPipe, INFINITE, QS_ALLEVENTS, MWMO_INPUTAVAILABLE); 
     if (res == WAIT_OBJECT_0) { 
      /* Handle named pipe -- at this point ReadFile will not block */ 
     } else if (res == WAIT_OBJECT_0 + 1) { 
      MSG msg; 
      if (!GetMessage(&msg, NULL, 0, 0)) 
       break; /* WM_QUIT */ 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
    } while (1); 
} 
+0

Pouvez-vous fournir une démo simple pour lire une structure de données à partir d'un tube par MsgWaitForMultipleObjects'? – wamp

+0

merci! Mais quelques merveilles, What 'WAIT_OBJECT_0' dans votre échantillon de code? Comment puis-je récupérer une ** structure ** spécifique dans un tube? – wamp

+1

Les tuyaux ne transportent pas de structures. Ils véhiculent des octets. Et WAIT_OBJECT_0 signifie simplement que le premier objet du tableau des handles d'attente est dans un état d'alerte - dans ce cas, le tableau des handles d'attente n'a qu'un seul objet, hNamedPipe. – bdonlan

1

Non, les messages Windows et les pipes nommés sont complètement indépendants. Vous devez utiliser la fonction MsgWaitForMultipleObjectsEx pour attendre un message entrant ou un message sur le canal nommé.

Notez que MsgWaitForMultipleObjectsEx ne récupère pas réellement le message; vérifiez sa valeur de retour pour voir s'il existe un message Windows ou des données sur le canal nommé, puis utilisez GetMessage ou ReadFile selon le cas.

+0

Pouvez-vous fournir une démo simple comment lire une structure de données à partir de pipe par 'MsgWaitForMultipleObjects', et comment écrire sur le tuyau? J'ai utilisé 'ReadFile' et' WriteFile' mais il ne peut traiter qu'avec des chaînes. – wamp

Questions connexes