2012-12-06 29 views
-1

我一直在試圖讓wndproc成功接收來自消息隊列的消息,並根據我的代碼處理它們,但它並不按照我希望的方式工作,我想要做的是確定哪個窗口收到了WM_DESTROY或WM_CLOSE以及特定於哪個窗口關閉的調用代碼,但由於某種原因,此時它什麼都不做。經過大量的實驗後,我已經以不同的方式部分發揮作用,但似乎每個實現都不能正確運行。這裏是我的最新的成功代碼:如何讓wndproc處理消息到多個窗口

while (GetMessage (&messages, NULL, 0, 0)) 
{ 
    /* Translate virtual-key messages into character messages */ 
    TranslateMessage(&messages); 
    /* Send message to WindowProcedure */ 
    DispatchMessage(&messages); 
} 

/* The program return-value is 0 - The value that PostQuitMessage() gave */ 
return messages.wParam; 
} 


/* This function is called by the Windows function DispatchMessage() */ 


LRESULT CALLBACK Proc2(HWND mainwin, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
switch (message)     /* handle the messages */ 
{ 
         case WM_DESTROY: 
         const HWND active_window = GetActiveWindow(); 
         if (active_window == mainwin) 
           { 
            PostQuitMessage(0); 
           } 
            if (active_window == hwnd2) 
            { 
               PostQuitMessage(0); 
               EnableWindow (mainwin, true); 
            } 
            break; 
} 
switch (wParam)     /* handle the messages */ 
{ 
       case ID_2 : 
      PostQuitMessage(0); 
      break; 
       case ID_1 : 
       ShowWindow (hwnd2, SW_SHOW);  
       break; 
          default:      /* for messages that we don't deal with */ 
     return DefWindowProc (mainwin, message, wParam, lParam); 
        break; 
} 

    return 0; 
}  

這裏是我有多個窗口程序

while (GetMessage (&messages, NULL, 0, 0)) 
{ 
    /* Translate virtual-key messages into character messages */ 
    TranslateMessage(&messages); 
    /* Send message to WindowProcedure */ 
    DispatchMessage(&messages); 
} 

/* The program return-value is 0 - The value that PostQuitMessage() gave */ 
return messages.wParam; 
} 


/* This function is called by the Windows function DispatchMessage() */ 


LRESULT CALLBACK Proc2(HWND mainwin, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
switch (message)     /* handle the messages */ 
{ 
         case WM_DESTROY: 
            PostQuitMessage(0); 
            break; 
} 
switch (wParam)     /* handle the messages */ 
{ 
       case ID_2 : 
      PostQuitMessage(0); 
      break; 
       case ID_1 : 
       ShowWindow (hwnd2, SW_SHOW);  
       break; 
          default:      /* for messages that we don't deal with */ 
     return DefWindowProc (mainwin, message, wParam, lParam); 
        break; 
} 

    return 0; 
}  
LRESULT CALLBACK Proc3(HWND hwnd2, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
      case WM_DESTROY: 
EnableWindow (mainwin, false); 
       break; 
case WM_CLOSE: 
EnableWindow (mainwin, false); 
break; 
} 
switch (wParam) 
{ 
    default: 
      return DefWindowProc (hwnd2, message, wParam, lParam); 
      break; 
      } 
      return 0; 
      } 

回答

1

你說試過代碼,

「我想它做的是確定哪個窗口收到WM_DESTROY或WM_CLOSE「

簡單的答案是,正在接收UINT message的窗口是HWND mainwin

如果你想知道「是的,但我的哪個窗戶是HWND mainwin?」那麼一種方法是,當你創建一個窗口時,你會記住它的窗口句柄,並將它存儲在某個地方(例如作爲一個全局變量)。


除此之外,你爲什麼打電話GetActiveWindow(),也不是你想實現什麼功能目前尚不清楚。

+0

CW因爲這不是一個很大的答案,但我認爲它太長才能發表評論,要求澄清這個問題。 – ChrisW

+0

你是說,因爲wndproc是要讓mainwin只有mainwin產生的消息(比如點擊窗口右上角的x)會去到那個wndproc?那麼我是否必須創建一個secodn wndproc?我試過了,它看起來像我的消息從第二個窗口hwnd2仍然去了第一個wndproc,getactivewindow的原因是因爲我認爲WM_DESTROY將發送到該wndproc無論哪個窗口生成的消息,所以我應該用它來確定哪個窗口生成了消息。我將編輯我的q以包含雙wndproc failcode – user1882226

+0

@ user1882226您在創建窗口時指定wndproc。如果使用相同的wndproc創建兩個窗口,那麼相同的wndproc將用於這兩個窗口。當wndproc被調用時,HWND參數會告訴你這兩個窗口中的哪一個正在接收消息。或者,您可以爲不同的窗口使用不同的wndproc。 wndproc就像一個C++類,HWND就像這個類的C++實例。如果你有兩個稍微不同的窗口行爲,你可以定義兩個稍微不同的wndprocs,它們都委託給一個公共的子例程來處理...... – ChrisW