PostMessage 是如何实现的

2024-11-30 01:18:40
推荐回答(2个)
回答1:

首先定义一个全局的句柄

HWND GWnd_MydlgWND;//

其次在你需要响应的窗口下(class CTestDlg : public CDialog)声明为外部引用
extern HWND GWnd_MydlgWND;

同时在该类下重载虚函数DefWindowProc ,用于接收消息

LRESULT CTestDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
switch(message)
{
case 0x401:MessageBox("测试程序");
break;

}
return CDialog::DefWindowProc(message, wParam, lParam);
}

再次是在你想要获得消息的窗口初始化函数(BOOL CTestDlg::OnInitDialog())中添加

// TODO: Add extra initialization here
GWnd_MydlgWND = GetSafeHwnd();

准备完毕

然后在你想要发送消息的地方发送
::PostMessage(GWnd_MydlgWND,0x401,0L,0L);//寄送消息

回答2:

BOOL PostMessage(
HWND hWnd, // handle to destination window
UINT Msg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);

PostMessage将消息投递到指定窗口的消息队列中,然后返回。
第一个参数 hWnd 确定应该把消息投递给哪个窗口。
接收消息的窗口线程在不停的进行消息循环,一有新消息就会将消息传递给窗口函数,窗口函数会根据消息类型,即 Msg 的值,采用不同的方式来处理这条消息,至于如何处理,就要看编写窗口函数的人是如何写的代码。