[DUG] selective processing of Windows messages

Ross Levis ross at stationplaylist.com
Tue Jul 18 19:52:32 NZST 2006


Well, it's quite complicated really.

I have 2 applications that communicate with each other via a shared 
memory component.  The App2 is like a service and doesn't have a UI, but 
it calls some 3rd party DLL's.  Some of these DLL's send various WM_USER 
messages with different lparam parameter values, requiring return 
values.  Some of these messages are best handled by the 2nd app, but I 
wish to transfer some over to the first app via SendMessage.

Trouble is that the main app (App1) waits in a loop for a response from 
App2 when it executes a command, so there is a hang situation where App1 
is waiting for App2 to finish executing a command, and App2 is waiting 
for a SendMessage reponse from App1.

I don't wish to run ProcessMessages in the App1 loop because this will 
cause timers to execute, but I wish to execute the WM_USER messages.

I can see now that I should be able to get around this by disabling the 
timers while in the loop so I can execute ProcessMessages.  I don't know 
why I didn't think of that earlier.

Ross.

----- Original Message ----- 
From: "Karl @ Work" <karlreynolds at xtra.co.nz>
To: "'NZ Borland Developers Group - Delphi List'" <delphi at ns3.123.co.nz>
Sent: Tuesday, July 18, 2006 5:39 PM
Subject: RE: [DUG] selective processing of Windows messages


> Does anyone know of a component or some easy way to
> selectively process
> the Windows message queue for the application.  For instance
> I may want
> a specific message to be processed but nothing else, or I may
> want all
> messages destined for a specific thread.
>
> For example, Application.ProcessMessages(Handle, WM_USER) would be
> perfect.

PeekMessage searches the message queue, eg. (untried)

procedure ProcessMessagesOfType(AHandle: HWND; AMessage: UINT);
var LMsg: TMsg;
begin
  while PeekMessage(LMsg, AHandle, AMessage, AMessage, PM_REMOVE) do
  begin
    TranslateMessage(LMsg);
    DispatchMessage(LMsg);
  end;
end;

Having said that, I'm curious to know why you want to process the 
message
queue out of order.  I suggest that there's probably a way to get what 
you
want without having to do that.  Maybe you could give us a bit more info
about what you're trying to achieve?

Other functions that might help:
PostThreadMessage targets a message to a particular thread
RegisterWindowMessage is useful to avoid WM_USER+X broadcast conflicts
between forms/apps

Cheers,
Carl

_______________________________________________
Delphi mailing list
Delphi at ns3.123.co.nz
http://ns3.123.co.nz/mailman/listinfo/delphi



More information about the Delphi mailing list