BCB下创建一个只接收消息的窗口,该如何处理
BCB下创建一个只接收消息的窗口 - C++ Builder / Windows SDK/API
请问各位大侠,如何在BCB下创建一个只接收消息的窗口(该窗口不显示出来)。
是不是要用CreateWindowEx()这个函数?
可是用这个函数好像又要用RegisterWndClass()....那个函数的参数WNDCLASS结构里面有几个参数我不知道怎么赋值。。。
请各位帮帮忙。。。
------解决方案--------------------
关于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;
}
请问各位大侠,如何在BCB下创建一个只接收消息的窗口(该窗口不显示出来)。
是不是要用CreateWindowEx()这个函数?
可是用这个函数好像又要用RegisterWndClass()....那个函数的参数WNDCLASS结构里面有几个参数我不知道怎么赋值。。。
请各位帮帮忙。。。
------解决方案--------------------
关于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;
}