日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

MFC的SendMessage函数详解

發(fā)布時(shí)間:2025/3/12 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC的SendMessage函数详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

SendMessage函數(shù)功能:該函數(shù)將指定的消息發(fā)送到一個(gè)或多個(gè)窗口。此函數(shù)為指定的窗口調(diào)用窗口程序,直到窗口程序處理完消息再返回。而函數(shù)PostMessage不同,將一個(gè)消息寄送到一個(gè)線(xiàn)程的消息隊(duì)列后立即返回。

函數(shù)原型 :

LRESULT SendMessageHWND hWndUINT wMsgWPARAM wParamLPARAM IParam);

參數(shù):

  hWnd其窗口程序?qū)⒔邮障⒌拇翱诘木浔?。如果此參?shù)為HWND_BROADCAST,則消息將被發(fā)送到系統(tǒng)中所有頂層窗口,包括無(wú)效或不可見(jiàn)的非自身?yè)碛械拇翱凇⒈桓采w的窗口和彈出式窗口,但消息不被發(fā)送到子窗口。

??? wMsg用于區(qū)別其他消息的常量值,這些常量可以是Windows單元中預(yù)定義的常量,也可以是自定義的常量.

??? wParam通常是一個(gè)與消息有關(guān)的常量值,也可能是窗口或控件的句柄

??? lParam通常是一個(gè)指向內(nèi)存中數(shù)據(jù)的指針。由于WParm、lParamPointer都是32位的,因此,它們之間可以相互轉(zhuǎn)換

返回值:返回值指定消息處理的結(jié)果,依賴(lài)于所發(fā)送的消息。

SendMessage用例

1.?????? 系統(tǒng)消息(WM_

::SendMessage(this->m_hWnd,WM_CLOSE,0,0);

SendMessage(hWnd,WM_KEYDOWN,VK_TAB,0x000f0001);

SendMessage(hWnd,WM_CHAR,VK_TAB,0x000f0001);

SendMessage(hWnd,WM_KEYUP,VK_TAB,0xc00f0001);

SendMessage(hWnd,WM_KEYDOWN,VK_TAB,0x000f0001);

SendMessage(hWnd,WM_CHAR,VK_TAB,0x000f0001);

SendMessage(hWnd,WM_KEYUP,VK_TAB,0xc00f0001);

SendMessage(hWnd,WM_KEYDOWN,VK_TAB,0x000f0001);

SendMessage(hWnd,WM_CHAR,VK_TAB,0x000f0001);

SendMessage(hWnd,WM_KEYUP,VK_TAB,0xc00f0001);

SendMessage(hWnd,WM_KEYDOWN,VK_RETURN,0x001c0001);

SendMessage(hWnd,WM_CHAR,VK_RETURN,0x001c0001);

SendMessage HWND, WM_SHOWWINDOW, SW_HIDE, vbNull '隱藏窗體

SendMessage HWND, WM_SHOWWINDOW, SW_NORMAL, vbNull '顯示窗體

SendMessage(HWND, WM_SYSCOMMAND, SC_CLOSE, ByVal 0&)?? '關(guān)閉

SendMessage(HWND, WM_SYSCOMMAND, SC_MINIMIZE, ByVal 0&) '最小化

SendMessage(HWND, WM_PASTE, 0, 0) '粘貼

SendMessage(HWND, WM_COPY, 0, 0) '復(fù)制

SendMessage(HWND, WM_UNDO, 0, 0) '撤消

2.?????? 通告消息

比如:給資源IDIDC_BUTTON2的按鈕,發(fā)送點(diǎn)擊消息:

SendMessage(WM_COMMAND,

MAKELONG(IDC_BUTTON2,BN_CLICKED),

(LPARAM)(GetDlgItem(IDC_BUTTON2)-> GetSafeHwnd()));

或:

???????? ::SendMessage(m_hWnd,

WM_COMMAND,

MAKELONG(IDC_BUTTON2,BN_CLICKED),

(LPARAM)(GetDlgItem(IDC_BUTTON2)-> GetSafeHwnd()));

例:給菜單ID為ID_GET的菜單項(xiàng),發(fā)送消息

::SendMessage(AfxGetMainWnd()->m_hWnd,WM_COMMAND,ID_GET,NULL);

?

3.?????? 用戶(hù)自定義消息

?SendMessge(WM_MYMSG,0,0);

或:

::SendMessge(::AfxGetMainWnd()->m_hWnd,WM_MYMSG,0,0);

4.?????? 向其他應(yīng)用程序發(fā)送消息

也可以為其他應(yīng)用程序發(fā)送消息,前提是找到窗體的句柄,如:與FindWindow()函數(shù)一起使用;

如:

CString str="360w.txt -記事本";//向窗口為str的記事本窗口發(fā)送WM_CLOSE消息

???????? CWnd *pWnd=CWnd::FindWindow(NULL,str);//獲取目的窗口對(duì)象

???????? ::SendMessage(*pWnd,WM_CLOSE,0,0);

窗口標(biāo)題的獲取方法:

1.?????? 使用VC++自帶工具SPY++

2.?????? 編程實(shí)現(xiàn),可用EnumWindows函數(shù)實(shí)現(xiàn);詳見(jiàn)“枚舉所有窗體,并向打開(kāi)的窗體發(fā)送關(guān)閉消息”http://download.csdn.net/detail/nuptboyzhb/4162747

?

舉例:

HWND gameh=NULL;
?gameh=::FindWindow(NULL,"窗口標(biāo)題");//參看游戲的標(biāo)題.可以用vc6.0自帶的Spy++工具查看

?CWnd* pWnd = CWnd::FromHandle(gameh);

//在坐標(biāo)為(x,y)的點(diǎn),發(fā)送鼠標(biāo)按下消息//注意,x,y是客戶(hù)區(qū)的坐標(biāo)

?::SendMessage(*pWnd,WM_LBUTTONDOWN,0,(y<<16)+x);

//發(fā)送鼠標(biāo)移動(dòng)消息,鼠標(biāo)移動(dòng)到點(diǎn)(x,y)

::SendMessage(*pWnd,WM_MOUSEMOVE,0,MAKELONG(x,y));

//發(fā)送粘貼消息

::SendMessage(dlg_hwnd,WM_PASTE,0,0);

5. 發(fā)送自己注冊(cè)的消息
5.1 發(fā)送端:

本示例先通過(guò)RegisterWindowMessage函數(shù)來(lái)注冊(cè)一條消息,然后用Win32 API函數(shù)SendMessage()發(fā)送。
主程序端:
建立MFC對(duì)話(huà)框,添加一個(gè)按鈕
在對(duì)話(huà)框CPP文件預(yù)處理下加入下面代碼:
static UINT NEAR WM_RGSMSG=RegisterWindowMessage("MESSAGE");//注冊(cè)一條發(fā)送MESSAGE的自己注冊(cè)的消息
在按鈕單擊事件函數(shù)中添加后:
void CMyDlg::OnButton1()
{
?// TODO: Add your control notification handler code here
?HWND? hwnd=::FindWindow(NULL,"接受窗口");//找到我們要發(fā)送消息的窗口句柄
?if(hwnd==NULL)
?{
??AfxMessageBox("沒(méi)有找到接受窗口");
??return;
?}
?else
??::SendMessage(hwnd,WM_RGSMSG,1,0);//發(fā)送消息
}


5.2 接收端:

本示例接受方,仍然是先通過(guò)RegisterWindowMessage函數(shù)來(lái)注冊(cè)一條相同的消息,然后定義消息宏,綁定處理函數(shù)
接收窗口:
建立MFC對(duì)話(huà)框工程
在對(duì)話(huà)框CPP文件預(yù)處理下加入下面代碼:
static UINT NEAR WM_RGSMSG=RegisterWindowMessage("MESSAGE");//注冊(cè)一條發(fā)送MESSAGE的自己注冊(cè)的消息
在消息宏聲明處
將消息聲明為:
afx_msg LRESULT OnRgsmsg(WPARAM wParam,LPARAM lparam);??? //聲明消息映射函數(shù)
在建立消息映射表的地方添加如下代碼:
ON_REGISTERED_MESSAGE(WM_RGSMSG,OnRgsmsg)//注冊(cè)的消息宏應(yīng)放在這個(gè)位置
在CPP文件中,添加函數(shù)定義,代碼如下:
LRESULT CMyDlg::OnRgsmsg(WPARAM wParam,LPARAM lParam)
{
?AfxMessageBox("接收到消息");
?return TRUE;
}

?

總結(jié)

以上是生活随笔為你收集整理的MFC的SendMessage函数详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。