[Spam] Re: [Spam] Re: [DUG] Intercepting messages in separate
units
Ross Levis
ross at stationplaylist.com
Tue Jun 28 13:33:00 NZST 2005
I read the following in the help for TApplicationEvents:
OnMessage only receives messages that are posted to the message queue, not those sent directly with the Windows API SendMessage function
I believe it is SendMessage that is being used to communicate with the application. I don't suppose there are any other options?
Cheers,
Ross.
----- Original Message -----
From: Kyley Harris
To: NZ Borland Developers Group - Delphi List
Sent: Tuesday, June 28, 2005 12:32 PM
Subject: [Spam] Re: [Spam] Re: [DUG] Intercepting messages in separate units
Yes. Use the TApplicationEvents object and the OnMessage event. This captures all messages to the application.
Ross Levis wrote:
I found the problem and it's now working. A silly error. Thanks for your help.
On a similar subject, I was wondering if it's possible to obtain messages sent to the Application object handle within a component (separate unit), without altering any mainform source?
This DLL can also communicate with other external applications by entering the Windows class name to search and obtain an application handle, and I would like to experiment with that.
Is that possible?
Thanks,
Ross.
----- Original Message -----
From: Kyley Harris
To: NZ Borland Developers Group - Delphi List
Sent: Tuesday, June 28, 2005 11:27 AM
Subject: [Spam] Re: [DUG] Intercepting messages in separate units
Hi Ross.
How and where are you telling the DLL which window handle to post its messages to?
is there a dll call such as SetWindowHandleformessaging(MyInstance.Handle) ? or does it just happen like magic?
Ross Levis wrote:
Hi Kyley
Yes, I do receive WM_USER messages. This is how the DLL communicates. As I mentioned, it works perfectly if I put all the message checking in the mainform, but it doesn't work in the separate unit, even with the AllocateHWnd.
Here is all my relevant code.
TMyComponent = class(TComponent)
private
FHandle: HWnd;
procedure WndProc(var Message: TMessage);
end;
constructor TMyComponent.Create;
begin
inherited Create(AOwner);
FHandle := AllocateHWnd(WndProc);
end;
destructor TMyComponent.Destroy;
begin
DeallocateHWnd(FHandle);
inherited Destroy;
end;
procedure TMyComponent.WndProc(var Message: TMessage);
begin
with Message do
if Msg = WM_USER then
begin
Result := lparam + wparam //(for example)
end
else Result := DefWindowProc(FHandle, Msg, wParam, lParam);
end;
I get a couple messages when the program loads but I never get Msg = WM_USER.
Do you see any problems with this code?
The following code, however, when placed in the mainform does detect WM_USER messages.
TForm1 = class(TForm)
...
procedure WMUSER(var Message: TMessage); message WM_USER;
end;
procedure TForm1.WMUSER(var Message: TMessage);
begin
with Message do
if Msg = WM_USER then showmessage('It Works!');
end;
I've tried different combinations of the syntax, including the message WM_USER; bit in the unit but it doesn't make any difference at all. In fact I still get other messages when the program starts.
Thanks for the help.
Ross.
----- Original Message -----
From: Kyley Harris
To: NZ Borland Developers Group - Delphi List
Sent: Monday, June 27, 2005 10:01 PM
Subject: [Spam] Re: [DUG] Intercepting messages in separate units
Try the wrapper class just incase you have made a blooper. but it is unlikely that you will ever receive a message with the ID WM_USER. that is simply an offset to coordinate with windows messages. eg WM_USERLOGON = WM_USER+1 is an example of a user defined message.
then
myobject = class(TObject)
procedure WMUSERLOGON(var msg:TMessage);message WM_USERLOGON;
end;
the above procedure will only ever receive that one message. You need to know exactly what messages you are expecting from the dll.
if you use my wrapper, and attached an instance of the above object to message handler it will route the messages to that instance..
Ross Levis wrote:
Thanks for that Kyley. I managed to implement AllocateHWnd etc, and everything appears correct and logical. It's picking up some Windows messages but not the WM_USER messages being sent. WM_USER is message number 1024. I'm getting Message.Msg = 28 and that's about it.
I tried the same code in the mainform as a test and this worked but only after I specified the following:
procedure MyMessage(var Message: TMessage); message WM_USER;
If I leave off "message WM_USER", then nothing gets through to the procedure in the mainform at all.
I tried this in the unit and it doesn't make any difference. Message 28 is still getting to the procedure and no 1024.
You can tell I'm no expert when it comes to this. Do I need to use your fancy looking wrapper class?
I must be missing something.
Thanks,
Ross.
----- Original Message -----
From: Kyley Harris
To: NZ Borland Developers Group - Delphi List
Sent: Monday, June 27, 2005 7:13 PM
Subject: [Spam] Re: [DUG] Intercepting messages in separate units
in the forms unit
function AllocateHWnd(Method: TWndMethod): HWND; deprecated; { moved to Classes.pas }
{$EXTERNALSYM AllocateHWnd}
procedure DeallocateHWnd(Wnd: HWND); deprecated; { moved to Classes.pas }
read the help will sort you out just fine
Ross Levis wrote:
I'm writing a component which communicates with a 3rd party DLL using WM_USER messages. After loading the DLL, I need to tell the DLL the handle to send user messages back to, so my unit can intercept them, but I don't know where to get a handle from. I know how to do it in the mainform of a program but not in a separate unit. The messages sent to the mainform do not appear to reach my unit.
What do I need to do to make this happen?
Thanks,
Ross.
----------------------------------------------------------------
_______________________________________________
Delphi mailing list
Delphi at ns3.123.co.nz
http://ns3.123.co.nz/mailman/listinfo/delphi
------------------------------------------------------------------
_______________________________________________
Delphi mailing list
Delphi at ns3.123.co.nz
http://ns3.123.co.nz/mailman/listinfo/delphi
--------------------------------------------------------------------
_______________________________________________
Delphi mailing list
Delphi at ns3.123.co.nz
http://ns3.123.co.nz/mailman/listinfo/delphi
----------------------------------------------------------------------
_______________________________________________
Delphi mailing list
Delphi at ns3.123.co.nz
http://ns3.123.co.nz/mailman/listinfo/delphi
------------------------------------------------------------------------
_______________________________________________
Delphi mailing list
Delphi at ns3.123.co.nz
http://ns3.123.co.nz/mailman/listinfo/delphi
--------------------------------------------------------------------------
_______________________________________________
Delphi mailing list
Delphi at ns3.123.co.nz
http://ns3.123.co.nz/mailman/listinfo/delphi
----------------------------------------------------------------------------
_______________________________________________
Delphi mailing list
Delphi at ns3.123.co.nz
http://ns3.123.co.nz/mailman/listinfo/delphi
------------------------------------------------------------------------------
_______________________________________________
Delphi mailing list
Delphi at ns3.123.co.nz
http://ns3.123.co.nz/mailman/listinfo/delphi
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://ns3.123.co.nz/pipermail/delphi/attachments/20050628/339af84d/attachment.html
More information about the Delphi
mailing list