在Windows中,用戶或系統(tǒng)中所發(fā)生的任何活動被當(dāng)作事件來處理,例如,用戶按下了鼠標(biāo)按鈕,就產(chǎn)生一鼠標(biāo)事件。對于所發(fā)生的每一個事件,Windows將其轉(zhuǎn)換成消息的形式放在一個稱為消息隊列的內(nèi)存區(qū)中,然后由Windows的消息發(fā)送程序選擇適合的對象,將消息隊列中的消息發(fā)送到欲接受消息的對象上。Windows的消息可分為四種類型: 關(guān)于自定義消息的參數(shù) 自定義消息如果光是消息那只能是一個通知。 1.SendMessage函數(shù)功能描述:將指定的消息發(fā)送到一個或多個窗口。此函數(shù)為指定的窗口調(diào)用窗口過程,直到窗口過程處理完消息后才返回。 .函數(shù)原型:
case WM_KEYDOWN: switch (wParam) { case VK_HOME: SendMessage (hwnd, WM_VSCROLL, SB_TOP, 0) ; break ; case VK_END: SendMessage (hwnd, WM_VSCROLL, SB_BOTTOM, 0) ; break ; case VK_PRIOR: SendMessage (hwnd, WM_VSCROLL, SB_PAGEUP, 0) ; break ; ... } return 0 ; ...
SendMessage(hwnd, WM_COPY, 0, 0); SendMessage(hwnd, WM_CUT, 0, 0); SendMessage(hwnd, WM_PASTE, 0, 0); 2)SendMessage與PostMessage的區(qū)別 3)SendMessage發(fā)送WM_COPYDATA消息在進(jìn)程間傳送數(shù)據(jù) std:string strData = "VC知識庫 VCKBASE.COM"; COPYDATASTRUCT cds; cds.dwData = 0; cds.cbData = strData.Length(); cds.lpData = strData.c_str(); ::SendMessage(hwnd, WM_COPYDATA, NULL, (LPARAM)&cds); 2.SendMessageCallback
函數(shù)功能:該函數(shù)將指定的消息發(fā)送到一個或多個窗口。此函數(shù)為指定的窗口調(diào)用窗口程序,并立即返回。當(dāng)窗口程序處理完消息后,系統(tǒng)調(diào)用指定的回調(diào)函數(shù),將消息處理的結(jié)果和一個應(yīng)用程序定義的值傳給回調(diào)函數(shù)。
函數(shù)原型:BOOL SendMessageCallback(HWND hwnd,UINT Msg,WPARAM wParam,LPARAM IParam,
SEhDASYNCPROC IpResultCallBack,DWORD dwData);
參數(shù):
hWnd:其窗口程序?qū)⒔邮障⒌拇翱诘木浔H绻藚?shù)為HWND_BROADCAST,則消息將被發(fā)送到系統(tǒng)中所有頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口,但消息不被發(fā)送到子窗口。
Msg:指定被發(fā)送的消息。
wParam:指定附加的消息指定信息。
IParam:指定附加的消息指定信息。
IpResultCallBack:指向回收函數(shù)的指針,窗曰程序處理完消息后調(diào)用該回調(diào)函數(shù)。參見SendAsyncProc可得到合適的回調(diào)函數(shù)的信息。如果hwnd為HWND_BROADCAST,系統(tǒng)為每個頂層窗口調(diào)用一次SendASyncProc回調(diào)函數(shù)。
dwData:一個應(yīng)用程序定義的值,被傳給由參數(shù)IPResultCallBack指向的回調(diào)函數(shù)。
返回值:如果函數(shù)調(diào)用成功,返回非零值。如果函數(shù)調(diào)用失敗,返回值是零。若想獲得更多的錯誤信息,請調(diào)用GetLastError函數(shù)。
備注:如果發(fā)送一個低于WM_USER范圍的消息給異步消息函數(shù)(PostMessage,SendNotifyMesssge;SendMessageCallback),消息參數(shù)不能包含指針。否則,操作將會失敗。函數(shù)將在接收線程處理消息之前返回,發(fā)送者將在內(nèi)存被使用之前釋放。
需要以HWND_BROADCAST方式通信的應(yīng)用程序應(yīng)當(dāng)用函數(shù)RegisterWindwosMessage來獲得應(yīng)用程序間通信的獨特的消息。
此回調(diào)函數(shù)僅當(dāng)調(diào)用SendMessagecallback的線程調(diào)用GetMessage,PeekMessage或WaitMessage時調(diào)用。
例如:
case WM_LBUTTONDOWN:
SendMessageCallback(hWnd,WM_LBUTTONUP,0,0,SendAsyncProc,0); //具體的回調(diào)函數(shù)實現(xiàn)
VOID CALLBACK SendAsyncProc(HWND hwnd,UINT uMsg,DWORD dwData,LRESULT lResult) { MessageBox(NULL,"Back From Main Window","SendMessageCallback",MB_OK); //下面可以進(jìn)行更進(jìn)一步的處理 } 還有這樣一個例子:
在《windows高級編程指南》中說道SendMessageCallback()在發(fā)送后就立即返回。但是我在堵塞測試的時候發(fā)現(xiàn),調(diào)用SendMessageCallback
的線程也死掉了, 下面是我的代碼 大概就是在用SendMessageCallback發(fā)送消息給對話框之前,創(chuàng)建一個Event,設(shè)置為無信號,然后在 對話框的消息響應(yīng)中等待Event變?yōu)橛行盘柌爬^續(xù)執(zhí)行,根據(jù)書上所說,SendMessageCallback()在發(fā)送會就返回, 那么發(fā)送消息的線程就應(yīng)該不會因為對話框在處理消息時候因為等待Event而給堵塞住,這樣發(fā)送線程就可以繼續(xù)執(zhí)行下面的SetEvent, 這樣對話框WaitForSingleObject()得以返回,這樣它也可以得以繼續(xù)執(zhí)行 。 void CMainFrame::OnOpendialog() { //該函數(shù)創(chuàng)建一個無模式對話框 CWorkingDialog* pdlg=new CWorkingDialog; ASSERT_VALID(pdlg); //Create the modeless dialog . represents this dialog. BOOL bResult = pdlg-> Create(IDD_DIALOG1); CString strMsg= "From MainFrame "; HANDLE hEvent=CreateEvent(NULL,TRUE,FALSE, "wait ");//創(chuàng)建事件通知 ,手動,無信號 SendMessageCallback(pdlg-> GetSafeHwnd(),WM_MSG,(WPARAM)(LPCTSTR)strMsg,0,FunCallback,0); strMsg= "Yes "; SetEvent(hEvent); } //響應(yīng)wm_msg void CWorkingDialog::OnTestMsg(WPARAM wParam ,LPARAM lParam) { HANDLE hEvent = CreateEvent(NULL,TRUE,FALSE, "wait "); ASSERT(GetLastError()==ERROR_ALREADY_EXISTS); CString str((LPCTSTR)wParam); WaitForSingleObject(hEvent,INFINITE);//等到有信號才執(zhí)行下面的代碼 MessageBox(str); } 但是這段代碼運行結(jié)果跟我上面的猜想不一致,是不是我對SendMessageCallback的“發(fā)送就返回”理解錯誤? 原因是對于SendMessageCallback()函數(shù), 如果發(fā)送到當(dāng)前線程中,則直接調(diào)用窗口過程,發(fā)送到其它線程中則立即返回。 3. SendNotifyMessage
函數(shù)功能:該函數(shù)將指定的消息發(fā)送到一個窗口。如果該窗口是由調(diào)用線程創(chuàng)建的;此函數(shù)為該窗口調(diào)用窗口程序,并等待窗口程序處理完消息后再返回。如果該窗口是由不同的線程創(chuàng)建的,此函數(shù)將消息傳給該窗口程序,并立即返回,不等待窗口程序處理完消息。
函數(shù)原型:BOOL SendNotifyMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
參數(shù):
hWnd:其窗口程序?qū)⒔邮障⒌拇翱诘木浔?。如果此參?shù)為HWND_BROADCAST,則消息將被發(fā)送到系統(tǒng)中所有頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口,但消息不被發(fā)送到子窗口。
Msg:指定被發(fā)送的消息。
wParam:指定附加的消息指定信息。
IParam:指定附加的消息指定信息。
返回值:如果函數(shù)調(diào)用成功,返回非零值;如果函數(shù)調(diào)用失敗,返回值是零。若想獲得更多的錯誤信息,請調(diào)用GetLastError函數(shù)。
備注:如果發(fā)送一個低于WM_USER范圍的消息給異步消息函數(shù)(PostMessage,SendNotifyMessage,SendMesssgeCallback),消息參數(shù)不能包含指針。否則,操作將會失敗。函數(shù)將在接收線程處理消息之前返回,發(fā)送者將在內(nèi)存被使用之前釋放。
需要以HWND_BROADCAST方式通信的應(yīng)用程序應(yīng)當(dāng)用函數(shù)RegisterWindwosMessage來獲得應(yīng)用程序間通信的獨特的消息。
例子:
case WM_RBUTTONDOWN:
HANDLE hThread; DWORD ThreadID; //創(chuàng)建一個線程,把當(dāng)前的窗口句柄作為參數(shù)傳遞給新線程 hThread=CreateThread(NULL,0,Thread1,hWnd,NULL,&ThreadID); break; case WM_LBUTTONDOWN: MessageBox(NULL,"Receiving Message:WM_LBUTTONDOWN","MESSAGE",MB_OK); break; //具體的線程函數(shù)實現(xiàn)
DWORD WINAPI Thread1(LPVOID param) { HWND hWnd=(HWND)param; SendNotifyMessage(hWnd,WM_LBUTTONDOWN,0,0); //一般情況下,這個消息框要比上面那個消息框早出現(xiàn),因為函數(shù)并不等待消息 //處理完成之后才返回 MessageBox(NULL,"Return From SendNotifyMessage","SendNotifyMessage",MB_OK); return 1; } 4. SendMessageTimeout
函數(shù)功能:該函數(shù)將指定的消息發(fā)送到一個或多個窗口。此函數(shù)為指定的窗口調(diào)用窗口程序,并且,如果指定的窗口屬于不同的線程,直到窗口程序處理完消息或指定的超時周期結(jié)束函數(shù)才返回。如果接收消息的窗口和當(dāng)前線程屬于同一個隊列,窗口程序立即調(diào)用,超時值無用。
函數(shù)原型:LRESULT SendMessageTimeout(HWND hwnd,UINT Msg,WPARAM wParam,LPARAM IParam,UINTfuFlags,UIUT uTimeout,LPDWORD lpdwResultult);
參數(shù):
hWnd:其窗口程序?qū)⒔邮障⒌拇翱诘木浔H绻藚?shù)為HWND_BROADCAST,則消息將被發(fā)送到系統(tǒng)中所有頂層窗口,包括無效或不可見的非自身擁有的窗口。
Msg:指定被發(fā)送的消息。
wParam:指定附加的消息指定信息。
IParam:指定附加的消息指定信息。
fuFlags;指定如何發(fā)送消息。此參數(shù)可為下列值的組合:
SMTO_ABORTIFHUNG:如果接收進(jìn)程處于“hung”狀態(tài),不等待超時周期結(jié)束就返回。
SMTO_BLOCK:阻止調(diào)用線程處理其他任何請求,直到函數(shù)返回。
SMTO_NORMAL:調(diào)用線程等待函數(shù)返回時,不被阻止處理其他請求。
SMTO_NOTIMEOUTIFNOTHUNG:Windows 95及更高版本:如果接收線程沒被掛起,當(dāng)超時周期結(jié)束時不返回。
uTimeout:為超時周期指定以毫秒為單位的持續(xù)時間。如果該消息是一個廣播消息,每個窗口可使用全超時周期。例如,如果指定5秒的超時周期,有3個頂層窗回未能處理消息,可以有最多15秒的延遲。
IpdwResult:指定消息處理的結(jié)果,依賴于所發(fā)送的消息。
返回值:如果函數(shù)調(diào)用成功,返回非零值。如果函數(shù)調(diào)用失敗,或超時,返回值是零。若想獲得更多的錯誤信息,請調(diào)用GetLastError函數(shù)。如果GetLastError返回零,表明函數(shù)超時。如果使用HWND_BROADCAST,SenddMessaggTimeout不提供單個窗口超時信息。 DWORD WINAPI Thread1(LPVOID param);
case WM_RBUTTONDOWN:
HANDLE hThread; DWORD ThreadID; //創(chuàng)建一個線程,把當(dāng)前的窗口句柄作為參數(shù)傳遞給新線程 hThread=CreateThread(NULL,0,Thread1,hWnd,NULL,&ThreadID); break; case WM_LBUTTONDOWN: Sleep(5000);//睡眠5秒 MessageBox(NULL,"Receving Messageg:LBUTTONDOWN","MESSAGE",MB_OK); break; DWORD WINAPI Thread1(LPVOID param)
{ HWND hWnd=(HWND)param; DWORD dwResult; LRESULT ret; //只等待三秒 ret=SendMessageTimeout(hWnd,WM_LBUTTONDOWN,0,0,SMTO_BLOCK,3000,&dwResult); if(ret==0) MessageBox(NULL,"Fail To Process Message","SendMessageTimeout",MB_OK); else MessageBox(NULL,"Success To Process Message","SendMessageTimeout",MB_OK); return 1; } 如果不 Sleep(5000);//睡眠5秒。先 MessageBox(NULL,"Receving Messageg:LBUTTONDOWN","MESSAGE",MB_OK);
后 if(ret==0);但是Sleep(5000);先 if(ret==0)后MessageBox(NULL,"Receving Messageg:LBUTTONDOWN","MESSAGE",MB_OK); 5.PostThreadMessage
函數(shù)原型:BOOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM IParam);
參數(shù)
idThread:其消息將被寄送的線程的線程標(biāo)識符。如果線程沒有消息隊列,此函數(shù)將失敗。當(dāng)線程第一次調(diào)用一個Win 32 USER或GDI函數(shù)時,系統(tǒng)創(chuàng)建線程的消息隊列。要得到更多的信息,參見備注。
Msg:指定將被寄送的消息的類型。
wParam:指定附加的消息特定信息。
IParam:指定附加的消息特定信息。
返回值:如果函數(shù)調(diào)用成功,返回非零值。如果函數(shù)調(diào)用失敗,返回值是零。若想獲得更多的錯誤信息,請調(diào)用GetLastError函數(shù)。如果idThread不是一個有效的線程標(biāo)識符或由idThread確定的線程沒有消息隊
列,GetLastError返回ERROR_INVALID_THREAD。
備注:消息將寄送到的線程必須創(chuàng)建消息隊列,否則調(diào)用PostThreadMessage會失敗。用下列方法之一來處理這種情況:
調(diào)用PostThreadMessage。如果失敗,調(diào)用Sleep,再調(diào)用PostThreadMessage,反復(fù)執(zhí)行,直到PostThreadMessage成功。
創(chuàng)建一個事件對象,再創(chuàng)建線程。在調(diào)用PostThreadMessage之前,用函數(shù)WaitForSingleObject來等特事件被設(shè)置為被告知狀態(tài)。消息將寄送到的線程調(diào)用PeekMessage(&msg,NULL,WM_USER,WM_USER,PM_NOREMOVE)來強制系統(tǒng)創(chuàng)建消息隊列。設(shè)置事件,表示線程已準(zhǔn)備好接收寄送的消息。
消息將寄送到的線程通過調(diào)用GetMesssge或PeekMesssge來取得消息。返回的MSG結(jié)構(gòu)中的hwnd成員為NULL。
case WM_RBUTTONDOWN:
HANDLE hThread; DWORD ThreadID,LocalThreadID; //將當(dāng)前線程ID作為參數(shù)傳遞給新線程 LocalThreadID=GetCurrentThreadId(); hThread=CreateThread(NULL,0,Thread1,(LPVOID)LocalThreadID,NULL,&ThreadID); break; //具體的線程函數(shù)實現(xiàn)
DWORD WINAPI Thread1(LPVOID param) { DWORD MainThreadID; MainThreadID=(DWORD)param; //向主線程發(fā)送一條消息 PostThreadMessage(MainThreadID,WM_LBUTTONDOWN,0,0); return 1; } 6.函數(shù)功能:該函數(shù)將一個消息放入(寄送)到與指定窗口創(chuàng)建的線程相聯(lián)系消息隊列里,不等待線程處理消息就返回,是異步消息模式。消息隊列里的消息通過調(diào)用GetMessage和PeekMessage取得。
函數(shù)原型:B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
參數(shù)
hWnd:其窗口程序接收消息的窗口的句柄。可取有特定含義的兩個值:
HWND_BROADCAST:消息被寄送到系統(tǒng)的所有頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口。消息不被寄送到子窗口。
NULL:此函數(shù)的操作和調(diào)用參數(shù)dwThread設(shè)置為當(dāng)前線程的標(biāo)識符PostThreadMessage函數(shù)一樣。
Msg:指定被寄送的消息。
wParam:指定附加的消息特定的信息。
IParam:指定附加的消息特定的信息。
返回值:如果函數(shù)調(diào)用成功,返回非零值:如果函數(shù)調(diào)用失敗,返回值是零。若想獲得更多的錯誤信息,請調(diào)用GetLastError函數(shù)。
備注:需要以 HWND_BROADCAST方式通信的應(yīng)用程序應(yīng)當(dāng)用函數(shù) RegisterwindwosMessage來獲得應(yīng)用程序間通信的獨特的消息。
如果發(fā)送一個低于WM_USER范圍的消息給異步消息函數(shù)(PostMessage.SendNotifyMessage,SendMesssgeCallback),消息參數(shù)不能包含指針。否則,操作將會失敗。函數(shù)將再接收線程處理消息之前返回,發(fā)送者將在內(nèi)存被使用之前釋放。
速查:Windows NT: 3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;頭文件:winuser.h;輸入庫:user32.lib;Unicode:在Windows NT環(huán)境下以Unicode和ANSI方式實現(xiàn)。
P.S. 為什么 “如果發(fā)送一個低于WM_USER范圍的消息給異步消息函數(shù)(PostMessage.SendNotifyMessage,SendMesssgeCallback),消息參數(shù)不能包含指針。否則,操作將會失敗。
#define WM_SENDMESSAGE WM_USER+1
#define WM_POSTMESSAGE WM_USER+2 DWORD WINAPI Thread1(LPVOID param)
case WM_SENDMESSAGE:
MessageBox(NULL,"本對話框結(jié)束之后SendMessage才會返回!","SendMessage",MB_OK); break; case WM_POSTMESSAGE: MessageBox(NULL,"本對話框結(jié)束之前PostMessage已經(jīng)返回!","SendMessage",MB_OK); break; case WM_RBUTTONDOWN: HANDLE hThread; DWORD ThreadID; //創(chuàng)建一個線程,將當(dāng)前的窗口句柄作為參數(shù)傳遞給該新創(chuàng)建的線程 hThread=CreateThread(NULL,0,Thread1,hWnd,NULL,&ThreadID); break; //具體的線程函數(shù)實現(xiàn)
DWORD WINAPI Thread1(LPVOID param) { HWND hWnd; hWnd=(HWND)param; //可以比較下面兩種發(fā)送消息的差別 PostMessage(hWnd,WM_POSTMESSAGE,0,0); // SendMessage(hWnd,WM_SENDMESSAGE,0,0); return 1; } 7. PostQuitMessage
函數(shù)功能:該函數(shù)向系統(tǒng)表明有個線程有終止請求。通常用來響應(yīng)WM_DESTROY消息。
函數(shù)原型:VOID PostQuitMessage(int nExitCode);
參數(shù):
nExitCode:指定應(yīng)用程序退出代碼。此值被用作消息WM_QUIT的wParam參數(shù)。
返回值:無。
備注:PostQuitMessage寄送一個WM_QUIT消息給線程的消息隊列并立即返回;此函數(shù)向系統(tǒng)表明有個線程請求在隨后的某一時間終止。
當(dāng)線程從消息隊列里取得WM_QUIT消息時,應(yīng)當(dāng)退出消息循環(huán)并將控制返回給系統(tǒng)。返回給系統(tǒng)的退出值必須是消息WM_QUIT的wParam參數(shù)。
case WM_LBUTTONDOWN:
PostQuitMessage(1); 8.BroadcastSystemMessage
該函數(shù)發(fā)送消息給指定的接受者。接受者可以是一個應(yīng)用程序、安裝驅(qū)動器、網(wǎng)絡(luò)驅(qū)動器、系統(tǒng)級設(shè)備驅(qū)動器或這些系統(tǒng)組件的組合。
函數(shù)原型:long BroadcastSystemMessage(DWORD dwFIags,LPDWORD IpdwRecipients,UINT UiMessage,WPARAMwParam,LPARAM IParam);
參數(shù): dwFlags:選項標(biāo)志??扇∠铝兄档慕M合:
BSF_FLUSHDISK:接受者處理消息之后清洗磁盤。
BSF_FORCEIFHUNG:繼續(xù)廣播消息,即使超時周期結(jié)束或一個接受者已掛起。 BSF_IGNORECURRENTTASK:不發(fā)送消息給屬于當(dāng)前任務(wù)的窗口。這樣,應(yīng)用程序就不會接收自己的消息。
BSF_NOHANG:強制掛起的應(yīng)用程序超時。如果一個接受者超時,不再繼續(xù)廣播消息。 BSF_NOTIMEOUTIFNOTHUNG:只要接受者沒掛起,一直等待對消息的響應(yīng)。不會出現(xiàn)超時。 BSF_POSTMESSAGE:寄送消息。不能和BSF_QUERY組合使用。
BSF_QUERY:每次發(fā)送消息給一個接受者,只有當(dāng)前接受者返回TRUE后,才能發(fā)送給下一個接受者。 lpdwRecipients:指向變量的指針,該變量含有和接收消息接受者的信息。此變量可為下列值的組合: BSM_ALLCOMPONENTS:廣播到所有的系統(tǒng)組件。
BSM_ALLDESKTOPS:Windows NT下,廣播到所有的桌面。要求SE_TCB_NAME特權(quán)。
BSM_APPLICATIONS:廣播到應(yīng)用程序。
BSM_INSTALLABLEDRIVERS:Windows 95下,廣播到安裝驅(qū)動器。
BSM_INTDRIVER:Windows 95下,廣播到網(wǎng)絡(luò)驅(qū)動器。
BSM_VXDS:Windows 95下,廣播到所有系統(tǒng)級設(shè)備驅(qū)動器。
當(dāng)函數(shù)返回時,此變量接受上述值的組合,以確定真正接受消息的接受者。如果此參數(shù)為NULL,則將消息廣播到所有的組件。
uiMessage:系統(tǒng)消息標(biāo)識符。
WParam:32位消息特定值。
IParam:32位消息特定值。
返回值:如果函數(shù)調(diào)用成功,返回值是正數(shù)。如果函數(shù)不能廣播消息,返回值是C1。如果參數(shù)dwFlags為BSF_QUERY且至少一個接受者返回BROADCAST_QUERY_DENY給相應(yīng)的消息,返回值是零。若想獲得更多的錯誤信息,請調(diào)用GetLastError函數(shù)。 備注:如果BSF_QUERY沒指定,函數(shù)發(fā)送指定的消息給所有請求的接受者,并忽略這些接受者返回的值。
RegisterWindowMessage中的BroadcastSystemMessage如何處理 我想用BroadcastSystemMessage來在兩個進(jìn)程之間通訊,我從一個進(jìn)程發(fā)送了一個用 RegisterWindowMessage注冊過的消息,但在目的進(jìn)程中卻沒有收到該消息. A:我認(rèn)為你應(yīng)該在兩個進(jìn)程的最高級窗口中都注冊該消息.請看下例: static UINT sBroadcastCommand = ::RegisterWindowMessage( _T("BroadcastCommand")); BEGIN_MESSAGE_MAP( Gui_Top_Level_MainFrame, Gui_MainFrame ) ON_REGISTERED_MESSAGE( sBroadcastCommand, onBroadcastCommand ) END_MESSAGE_MAP() LRESULT Gui_MainFrame :: onBroadcastCommand( UINT aMsg, LPARAM lParam ) { your code... }然后發(fā)送進(jìn)行應(yīng)該包含: While the sending process would contain: static UINT sBroadcastCommand = ::RegisterWindowMessage( _T("BroadcastCommand")); void Someclass :: someMethod( void ) { ::PostMessage( (HWND)HWND_BROADCAST,sBroadcastCommand, 0,yourMessageId ); } 9.ReplyMessage 函數(shù)功能:該函數(shù)用于應(yīng)答由函數(shù)SendMessage發(fā)送的消息,不返回控制給調(diào)用SendMessage的函數(shù)。 函數(shù)原型:BOOL ReplyMessage(LRESULTIResult); 參數(shù): IResult:指定消息處理的結(jié)果??赡艿闹涤伤l(fā)送的消息確定。 返回值:如果調(diào)用線程正處理從其他線程或進(jìn)程發(fā)送的消息,返回非零值。如果調(diào)用線程不是正處理從其他線程或進(jìn)程發(fā)送的消息,返回值是零。 備注:調(diào)用此函數(shù),接收消息的窗口程序允許調(diào)用SendMessage的線程繼續(xù)運行,盡管接收消息的線程已返回控制。調(diào)用ReplyMessage的線程也繼續(xù)運行。 如果消息不是通過SendMessage發(fā)送的,或者消息由同一個線程發(fā)送,ReplyMessage不起作用。 case WM_LBUTTONDOWN: //具體的線程函數(shù)實現(xiàn) while (WaitMessage()) 10. WM_NOTIF在WIN32中得到大量的應(yīng)用,同時也是隨著CommControl的出現(xiàn)WM_NOTIFY成為了CommControl的基本消息??梢赃@樣說CommControl的所有的新增特性都通過WM_NOTIFY來表達(dá)。同時WM_NOTIFY也為CommControl的操作帶來了一致性。
|
|