关于dll中接收消息的问题
由于接收消息必须要有hwnd,也就是需要有个窗口对应才能接收消息,但在Dll中不需要这个窗口,却又想要能够接收消息。
这样的话,就可以在Dll中创建一个“消息窗口(Message-Only窗口)”,这种窗口仅仅用于处理消息,而不会被显示出来。
在创建时指定CreateWindowEx的参数hwndParent为HWND_MESSAGE. 或在创建窗口后SetParent(hWnd, HWND_MESSAGE);即可建立一
个“消息窗口”
BOOL InitMessageOnlyWindow()
{
HINSTANCE hInstance = NULL;
hInstance = GetModuleHandle(NULL);
if (hInstance == NULL)
{
return FALSE;
}
WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);
wndcls.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndcls.hInstance=hInstance;
wndcls.lpfnWndProc=MessageOnlyWinProc;
wndcls.lpszClassName="Message-Only Window";
wndcls.lpszMenuName=NULL;
wndcls.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndcls);
m_hwnd = CreateWindowEx(0,"Message-Only Window","Message-Only Window",0,0,0,0,0,HWND_MESSAGE,0,hInstance,0);
if (m_hwnd == NULL)
{
return FALSE;
}
return TRUE;
}
LRESULT CALLBACK MessageOnlyWinProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)//用于处理消息窗口接收到的消息,接收播放结束信号。
{
switch(uMsg)
{
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_GRAPHNOTIFY:
DoSomeThing();
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}