2013-01-17 116 views
0

我一直在努力學習如何使用SetWindowLongPtr()並把它理解爲以下幾點:SetWindowLongPtr()如何傳遞消息?

  1. 您可以使用下面的函數來獲取當前消息,並將其發送至自定義協議: LONG_PTR Some_Ptr = SetWindowLongPtr(Some_Hwnd, GWLP_WNDPROC, (LONG_PTR)Custom_Proc);

  2. 創建自定義協議,舉例如下:

    static LRESULT CALLBACK Custom_Proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
    { 
        switch (msg) 
        { 
         case WM_COMMAND: 
          MessageBox(hwnd,"This is a window","OKAY",NULL); 
          break; 
         default: 
          return CallWindowProc((WNDPROC)Some_Ptr, hwnd, msg, wParam, lParam); 
          break; 
        } 
        return CallWindowProc((WNDPROC)Some_Ptr, hwnd, msg, wParam, lParam); 
    } 
    

我的問題如下:

  1. 我在這裏錯過了什麼嗎?它是否正確?
  2. 你在哪裏打電話SetWindowLongPtr()?如果你需要特定的情況,想象一下在WM_CREATE中創建的按鈕句柄爲Some_Hwnd。但我寧願讓它在其他情況下開放。
+2

我覺得你很困惑。根據文檔,GWLP_WNDPROC更改指定窗口的窗口過程,因此發送到該窗口的任何未來消息都將轉到新過程。它不會「以任何我知道的方式獲取當前消息」。 –

+0

好的...我想我明白了。這裏有另一個需要澄清的問題,假設我在更改其過程到一個新的'Custom_Proc'後點擊一個按鈕。通常情況下,它會發送'WM_COMMAND'和'LOWORD(wParam)== BN_CLICKED'。它是否也這樣做? – hherbol

+0

對於後續問題,至少如果新問題有其自己的意義,那麼發佈一個新問題是一個好主意,就像第二個問題一樣。 – alk

回答

4

這被稱爲「子窗口分類」。它是一種標準的Windows編程技術,允許修改其代碼無法修改的窗口的行爲。就像你的情況下內置的Button類一樣。

有幾個細節,像子窗口的特定實例子類別與全局子分類。超級分類技術確保窗口在創建之前自定義。這在SDK documentation和任何關於本地winapi編程的書中都有很好的描述。像Petzold的「Programming Windows」一樣,如果你想破解winapi代碼,則需要閱讀。

3

我覺得你很困惑。根據文檔,GWLP_WNDPROC更改指定窗口的窗口過程,因此發送到該窗口的任何未來消息都將轉到新過程。它不會「以任何我知道的方式獲取當前消息」。