windows訊息機制與執行個體

來源:互聯網
上載者:User

標籤:尋找   訊息傳遞   導致   pat   class   訊息分發   null   另一個   pcl   

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)
{
    TranslateMessage(&Msg); //可選,有的會用到
    DispatchMessage(&Msg);
}

1. 訊息迴圈調用GetMessage()從訊息佇列中尋找訊息進行處理,如果訊息佇列為空白,程式將停止執行並等待(程式阻塞)。

2. 事件發生時導致一個訊息加入到訊息佇列(例如系統註冊了一個滑鼠點擊事件),GetMessage()將返回一個正值,這表明有訊息需要被處理,並且訊息已經填充到傳入的MSG參數中;當傳入WM_QUIT訊息 時返回0;如果傳回值為負表明發生了錯誤。

3. 取出訊息(在Msg變數中)並將其傳遞給TranslateMessage()函數,這個函數做一些額外的處理:將虛擬索引值資訊轉換為字元資訊。

4. 上面的步驟執行完後,將訊息傳遞給DispatchMessage()函數。DispatchMessage()函數將訊息分發到訊息的目標視窗,並且尋找目標視窗過程函數,給視窗過程函數傳遞視窗控制代碼、訊息、wParam、lParam等參數然後調用該函數。

5. 在視窗過程函數中,檢查訊息和其他參數,你可以用它來實現你想要的操作。如果不想處理某些特殊的訊息,你應該總是調用DefWindowProc()函數,系統將按按預設的方式處理這些訊息(通常認為是不做任何操作)。
6. 一旦一個訊息處理完成,視窗過程函數返回,DispatchMessage()函數返回,繼續迴圈處理下一個訊息。

 

 

 

 

 

 

 

 

 

     

windows訊息機制與執行個體

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.