La diferencia entre SendMessage y PostMessage en VC
1. PostMessage enviará el mensaje a la cola de mensajes del hilo donde se encuentra la ventana y luego regresará; mientras SendMessage no pasa por la cola de mensajes, se puede considerar que SendMessage llama directamente a la ventana. procedimiento de la ventana, por lo que cuando necesitamos Al obtener el valor de retorno después del procesamiento del mensaje, se utiliza SendMessage.
Por ejemplo: cuando se especifica lo siguiente en el programa: PostMessage (hWnd, WM_MSG,0,0), cuando el programa ejecute PostMessage, solo el mensaje WM_MSG se enviará a la ventana señalada por hWnd. La cola de mensajes de ese hilo, y luego el programa continuará ejecutándose. En cuanto a cuándo el programa responde al mensaje, depende de cuándo ese hilo obtiene el control;
Y especifique el siguiente uso: SendMessage (hWnd, WM_MSG, 0,0), luego, cuando el programa se ejecute allí, se producirá un salto: desde la posición actual, salte al procedimiento de ventana de hWnd para responder al mensaje WM_MSG. Cuando finalice el procesamiento del mensaje, la ventana. El procedimiento regresa y el programa continuará la ejecución desde detrás de SendMessage. Por supuesto, podemos obtener el resultado del procesamiento del mensaje mediante el procedimiento de ventana, es decir, tomar el valor de retorno de SendMessage. (Esto es sólo para un solo hilo).
2. En aplicaciones multiproceso, el uso de PostMessage sigue siendo el mismo, pero SendMessage es diferente. Si el mensaje SendMessage (hWndB, WM_MSG, 0, 0) se envía en el subproceso A a una ventana hWndB creada por el subproceso B, el sistema cambiará inmediatamente la ejecución directamente del subproceso A al subproceso B y luego llamará a hWndB en el subproceso B. procedimiento de ventana para procesar el mensaje, y después de procesar el mensaje, el derecho de ejecución todavía está en manos de B! En este momento, el subproceso A se detiene en SendMessage, esperando la próxima vez que el subproceso A obtenga derechos de ejecución antes de continuar con la ejecución, y aún puede obtener el resultado del procesamiento del mensaje (valor de retorno). Generalmente, para evitar un punto muerto, antes de procesar WM_MSG en B, agregue: if(InSendMessage())
RelpyMessage(lResult);
Es decir, juzgue: if If el mensaje se envía desde otro hilo, inmediatamente RelpyMessage responderá al mensaje. El parámetro lResult es el valor de retorno. Si está en el mismo hilo, InSendMessage() devolverá FALSO.