windows傳送視窗訊息
所需工具:spy++,visual studio 2017,c#語言
技術路線:首先通過spy++獲得所要操縱的視窗的控制代碼,函式的原型宣告為:
[dllimport("user32.dll")]
public static extern intptr findwindow(string lpclassname, string lpwindowname);
此函式獲得目標視窗的控制代碼,如果要獲得某個子視窗的控制代碼,通過以下函式可獲得:
[dllimport("user32.dll ")]
public static extern intptr findwindowex(intptr parent, intptr childe, string strclass, string frmtext);
對目標視窗的操作(傳送指令),使用的函式原型如下:
[dllimport("user32.dll", charset = charset.auto)]
public static extern int sendmessage(intptr hwnd, int msg, int wparam, int lparam);
我通過sendmessage函式傳送的是繪圖動作,具體包括滑鼠的down,move,up
另乙個傳送訊息的函式,原型宣告:
[dllimport("user32.dll", entrypoint = "postmessage")]
private static extern int postmessage(intptr hwnd, int msg, int wparam, int lparam);
我通過postmessage函式傳送的是點選按鈕的動作,具體包括滑鼠的down,up
sendmessage與postmessage函式的差別
sendmessage為這個指定的訊息呼叫視窗處理程式,直到視窗處理完這個程式後才會返回;postmessage函式傳送乙個訊息到執行緒訊息對列中,並立即返回。
失敗部分:1.在繪圖過程中,我考慮過用wm_paint傳送繪圖訊息,但是檢視msdn手冊後發現wm_paint訊息是由系統產生的,它不應該由乙個應用程式傳送。我也考慮過先生成乙個圖形,然後將它傳送到視窗,這樣違背了最初測試的目的。
失敗經驗總結:首先要確定技術路線,不能盲目亂試,檢視官方文件的函式介紹。
windows中的訊息機制:訊息就是一些指令。如果你想讓視窗或控制項(實質上,控制項是特殊的視窗)執行何種動作,你應該傳送乙個訊息給它;如果另乙個視窗想讓你執行何種操作,它可以傳送乙個訊息給你。如果乙個事件,如敲擊鍵盤、移動滑鼠、點選按鈕等,系統將訊息傳送給視窗,如果你是這些視窗之一,你將接收到訊息執行相應的操作。
訊息佇列:當訊息傳送過來,將訊息加入訊息佇列,當乙個訊息被處理時,將其從訊息佇列移除。這樣確保訊息不會丟失,當你正在處理乙個訊息時,其它到來的訊息可以加入到訊息佇列直到被處理。
訊息迴圈:
while(getmessage(&msg, null, 0, 0) >0)
1. 訊息迴圈呼叫getmessage()從訊息佇列中查詢訊息進行處理,如果訊息隊列為空,程式將停止執行並等待(程式阻塞)。
2. 事件發生時導致乙個訊息加入到訊息佇列(例如系統註冊了乙個滑鼠點選事件),getmessage()將返回乙個正值,這表明有訊息需要被處理,並且訊息已經填充到傳入的msg引數中;當傳入wm_quit訊息 時返回0;如果返回值為負表明發生了錯誤。
3. 取出訊息(在msg變數中)並將其傳遞給translatemessage()函式,這個函式做一些額外的處理:將虛擬鍵值資訊轉換為字元資訊。
4. 上面的步驟執行完後,將訊息傳遞給dispatchmessage()函式。dispatchmessage()函式將訊息分發到訊息的目標視窗,並且查詢目標視窗過程函式,給視窗過程函式傳遞視窗控制代碼、訊息、wparam、lparam等引數然後呼叫該函式。
5. 在視窗過程函式中,檢查訊息和其他引數,你可以用它來實現你想要的操作。如果不想處理某些特殊的訊息,你應該總是呼叫defwindowproc()函式,系統將按按預設的方式處理這些訊息(通常認為是不做任何操作)。
6. 一旦乙個訊息處理完成,視窗過程函式返回,dispatchmessage()函式返回,繼續迴圈處理下乙個訊息。
windows訊息機制
一 windows中有乙個系統訊息佇列,對於每乙個正在執行的windows應用程式,系統為其建立乙個 訊息佇列 即應用程式佇列,用來存放該程式可能 建立的各種視窗的訊息。應用程式中含有一段稱作 訊息迴圈 的 用來從訊息佇列中檢索這些訊息並把它們分發到相應的視窗函式中。二 windows為當前執行的每...
windows訊息機制
一 windows中有乙個系統訊息佇列,對於每乙個正在執行的windows應用程式,系統為其建立乙個 訊息佇列 即應用程式佇列,用來存放該程式可能 建立的各種視窗的訊息。應用程式中含有一段稱作 訊息迴圈 的 用來從訊息佇列中檢索這些訊息並把它們分發到相應的視窗函式中。二 windows為當前執行的每...
Windows訊息機制
訊息佇列分為 系統訊息佇列 執行緒訊息佇列 應用程式訊息佇列 系統訊息佇列 這是系統唯一的佇列,輸入裝置 滑鼠 鍵盤等 的驅動程式把使用者的操作轉換成訊息的形式放置到系統佇列中,然後系統會把此訊息轉到目標視窗所在的執行緒訊息佇列中等待處理。執行緒訊息佇列 每個gui 圖形使用者 介面 graphic...