G
Guest
When I use the SendMessage API I can sucessfully send and receive a user
defined message.
When I use the PostMessage API I can NOT sucessfully send and receive the
same user defined message.
I've got a C# class library project with two classes:
Class 1 is derives from : System.Windows.Forms.Form and overrides the base
WndProc method for the purpose of receiving and handeling user defined
messages:
protected override void WndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case WM_MESSAGE1:
// do something here.
break;
case WM_MESSAGE2:
// do something here.
break;
default:
// do something here.
break;
}
Class 2 is created by Class 1 and runs as a background thread. At the
appropriate time Class 2 will either use:
SendMessage - when Class2 needs to wait for Class 1 to process the message
and possible return a response.
PostMessage - when Class2 does not need to wait for Class1 to processes
the message.
Class 2 uses this code to Send / Post the user defined messages:
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern Int32 SendMessage(IntPtr hWnd, Int32 msg, Int32
wParam, IntPtr lParam);
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern Int32 PostMessage(IntPtr hWnd, Int32 msg, Int32
wParam, IntPtr lParam);
private const Int32 WM_USER= (0x400);
private const Int32 WM_MESSAGE1 = (WM_USER + 101);
private const Int32 WM_MESSAGE2 = (WM_USER + 102);
// THIS CODE SUCCEEDS.
IntPtr lParam = System.IntPtr.Zero;
int res = SendMessage(Class1.Handle, WM_MESSAGE1, 0, lParam);
// THIS CODE FAILS.
IntPtr lParam = System.IntPtr.Zero;
PostMessage(Class1.Handle, WM_MESSAGE1, 0, lParam);
I'm logging the messages (m.Msg) that are arriving in Class1 - WndProc
function to a file for review. The log file shows that both the SendMessage
and PostMessage API calls cause the Class1 - WndProc method to fire, but in
the case of PostMessage the message that I'm looking for WM_MESSAGE1 never
arrives.
The log file also shows both the SendMessage and PostMessage cause exactly
the same additional messages to appear in the Class1 - WndProc method that I
did not explicitly issue. There are about 23 or so additional messages that
appear in the log prior to WM_MESSAGE1. But in the case of PostMessage
WM_MESSAGE1 never arrives. Just the other non-WM_MESSAGE1 messages appear in
the log.
Any idea why this might be?
Thanks in advance.
defined message.
When I use the PostMessage API I can NOT sucessfully send and receive the
same user defined message.
I've got a C# class library project with two classes:
Class 1 is derives from : System.Windows.Forms.Form and overrides the base
WndProc method for the purpose of receiving and handeling user defined
messages:
protected override void WndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case WM_MESSAGE1:
// do something here.
break;
case WM_MESSAGE2:
// do something here.
break;
default:
// do something here.
break;
}
Class 2 is created by Class 1 and runs as a background thread. At the
appropriate time Class 2 will either use:
SendMessage - when Class2 needs to wait for Class 1 to process the message
and possible return a response.
PostMessage - when Class2 does not need to wait for Class1 to processes
the message.
Class 2 uses this code to Send / Post the user defined messages:
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern Int32 SendMessage(IntPtr hWnd, Int32 msg, Int32
wParam, IntPtr lParam);
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern Int32 PostMessage(IntPtr hWnd, Int32 msg, Int32
wParam, IntPtr lParam);
private const Int32 WM_USER= (0x400);
private const Int32 WM_MESSAGE1 = (WM_USER + 101);
private const Int32 WM_MESSAGE2 = (WM_USER + 102);
// THIS CODE SUCCEEDS.
IntPtr lParam = System.IntPtr.Zero;
int res = SendMessage(Class1.Handle, WM_MESSAGE1, 0, lParam);
// THIS CODE FAILS.
IntPtr lParam = System.IntPtr.Zero;
PostMessage(Class1.Handle, WM_MESSAGE1, 0, lParam);
I'm logging the messages (m.Msg) that are arriving in Class1 - WndProc
function to a file for review. The log file shows that both the SendMessage
and PostMessage API calls cause the Class1 - WndProc method to fire, but in
the case of PostMessage the message that I'm looking for WM_MESSAGE1 never
arrives.
The log file also shows both the SendMessage and PostMessage cause exactly
the same additional messages to appear in the Class1 - WndProc method that I
did not explicitly issue. There are about 23 or so additional messages that
appear in the log prior to WM_MESSAGE1. But in the case of PostMessage
WM_MESSAGE1 never arrives. Just the other non-WM_MESSAGE1 messages appear in
the log.
Any idea why this might be?
Thanks in advance.