zzz同樣是 windows環境下32位組合語言程式設計 書中的例子,程式a向程式b傳送訊息,程式b響應這個訊息,**如下
code
傳送程式**:
#include
<
windows.h
>
intwinapi winmain(hinstance hinstance,hinstance hprevinstance,lpstr lpcmdline,
intncmdshow)
messagebox(hwnd,
"send fail!",
"fail
",mb_ok);
return0;
}接收程式**
code
#include
<
windows.h
>
lresult callback _procwinmain(hwnd,uint,wparam,lparam);
intwinapi winmain(hinstance hinstance,hinstance hprevinstance,lpstr lpcmdline,
intncmdshow)
}return0;
}lresult callback _procwinmain(hwnd hwnd,uint umsg,wparam wparam,lparam lparam)
else
if(umsg
==wm_destroy)
else
if(umsg
==wm_settext)
else
return0;
}例子很簡單,但是心裡有個疑問,程式a本身產生的訊息和程式b產生的訊息之間是否有什麼差別?能否在程式中識別當前的訊息是否本身產生的?否則響應程式的流程不就是亂了嗎?
我感覺這個訊息互發的功能應該沒這麼簡單,繼續研究去~
發現一件有趣的事情,不僅是wm_settext訊息可以通過另外的程式傳送,連wm_close,wm_destroy訊息也可以,也就是說我可以用乙個程式遠端關掉另外乙個程式,嘗試了一下,程式**如下
code
#include
<
windows.h
>
intwinapi winmain(hinstance hinstance,hinstance hprevinstance,lpstr lpcmdline,
intncmdshow)
messagebox(hwnd,
"send fail!",
"fail
",mb_ok);
return0;
}確實是可以的,開了send程式以後receive程式真的就被關掉了,哈哈。但是,到此又有了乙個疑問,還有乙個訊息wm_quit也是完成關閉視窗的功能的,這個訊息能成功嗎?
試驗了一下,竟然不行!問題處在**?google了一下,原來sendmessage直接將訊息傳送到視窗,並呼叫視窗處理程式,完成訊息響應,即sendmessage 根本就沒有將訊息發到訊息對列中,因此getmessage無法從訊息對列中收到wm_quit的訊息,所以receive程式無法關閉。
那是不是沒辦法傳送wm_quit訊息了呢?當然不是,windows給我們提供了postmessage函式,用法和sendmessage函式一樣,使用postmessage函式是將訊息插入訊息佇列中的,因此recieve程式就能夠響應wm_quit訊息了,用postmessage函式試驗一下,成功!
那麼postmessage函式和sendmessage函式是否一樣呢?我們用postmessage函式來傳送一下wm_settext命令試一下,receive函式沒反應!看來,postmessage和sendmessage名字差不多,功能可是有很大不同的,具體有什麼不同,研究下,放到下篇部落格再說了:)
使用C 在應用程式間傳送訊息
摘要 說來說去,還是覺得api的功能是最強大的,但是.net fcl,mfc等對api的封裝之後也使得程式的開發變得更加容易。本模組的主要原理還是使用api,查詢指定型別,視窗文字的視窗物件,獲取該物件的指標。然後操作該物件。例項1 建立乙個c windows form應用程式,向視窗中新增乙個按鈕...
應用程式間通訊 URL Scheme
ios 的設計思路是原則上禁止不同的應用程式之間相互訪問彼此的資料。雖然對於像我這樣的桌面應用開發人員而言,不能訪問程式以外的資料是不能想象的。但是從安全角度來說不失為乙個有效的策略。不過凡事總有例外,所以賈伯斯還是為程式間通訊開放了幾個介面。ios 上的應用程式可以通過向其它應用程式傳送乙個url...
Linux應用程式設計 11 程序間通訊 訊息佇列
向訊息佇列傳送訊息 msgsnd 從訊息佇列接收訊息 msgrcv 控制訊息佇列 msgctl 訊息佇列 示例 訊息佇列是system v ipc物件的一種 訊息佇列由訊息佇列id來唯一標識 訊息佇列就是乙個訊息的列表。使用者可以在訊息佇列中新增訊息 讀取訊息等 訊息佇列可以按照型別來傳送 接收訊息...