2009-12-22 34 views
1

我想在打開特定對話框時進行一些處理,但在對話框打開時我無法找到任何方式獲取通知。打開Windows對話框時的通知

有沒有什麼辦法可以在應用程序中打開特定的窗口對話框?

關於對話框的唯一可用信息是其標題及其唯一。

+0

模態或無模式?在你的過程中?爲什麼你不知道對話正在打開_before_它打開? – 2009-12-22 09:07:28

+0

它是一個模態對話框,不在我的過程中。 我只想在打開它後收到通知。 – anand 2009-12-22 09:14:01

+0

我很確定你也知道窗口類。啓動Spy ++進行驗證,並查看它是否是唯一的。使用窗口類可能會更加健壯。 – IInspectable 2018-02-22 10:49:35

回答

2

一般的解決方案是使用windows掛鉤,過濾到WH_CBT,過濾到WM_CREATE或類似的東西,獲取窗口文本,看看它是否是你感興趣的。

更重要的一點:在鉤子中,你應該使用SetWindowLongPtr()來設置窗口進程到你自己的函數,這將實際上接收WM_CREATE事件。在所有的調用中,這個函數應該調用原始的窗口過程。

+0

-1,WH_CALLWINDOWPROC是這個問題的一個不好的解決方案。你將不得不基本聽系統每一個窗口消息,因爲你唯一的選擇是本地鉤子(這不會在這裏工作)或全局的。你可能只需在FindWindow上創建一個線程和SPIN,它比收聽系統中的每個發送消息要便宜。 – 2009-12-22 21:30:43

+0

是的。對不起,這絕對不是WH_CALLWNDPROC。 WH_CBT就是我想說的。 – ironic 2009-12-22 22:24:05

0

編輯:對不起沒有注意到你自己沒有代碼,但只有標題。因此,我認爲其他職位的解決辦法是你所需要的

事件在Win32應用程序處理通過所謂的窗口過程,它是具有以下簽名的回調函數來完成:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 

這個回調函數被調用通過窗口每次有一個消息的窗口這個回調函數註冊。首先發送到新窗口的消息之一是WM_CREATE消息。

如果您正在使用win32 API「手動」創建窗口,那麼應該有一個靜態回調函數,就像下面可以過濾WM_CREATE消息的函數一樣。

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch(message) 
    { 
    case WM_CREATE: 
     // do what ever you want 
     return 0; 

    case default: 
     return DefWndProc(hwnd, message, wParam, lParam); 

    } 
} 

如果使用MFC對話框(CDialog的),那麼你可以覆蓋功能CDialog::OnInitDialog()

0

好的,這樣做的方法是使用SetWindowsHookEx(WH_SYSMSGFILTER,...) 你會得到比你真正需要更多的回調。和全局鉤子是對系統性能有真正的漏極(它們可以強制系統序列化,通常會獨立運行的東西)

務必閱讀說明,特別是這部分:

和SetWindowsHookEx可以用於將DLL注入到另一個進程中。 32位DLL無法注入64位進程,64位DLL無法注入32位進程。如果應用程序需要在其他進程中使用鉤子,則需要32位應用程序調用SetWindowsHookEx將32位DLL注入到32位進程中,並且64位應用程序調用SetWindowsHookEx以注入64位DLL轉換爲64位進程。 32位和64位DLL必須具有不同的名稱。

你的鉤子必須住在一個dll中,並且dll最終會加載到其他進程的地址空間中,所以你不會無法訪問你的過程的地址空間,你必須設置你的鉤子和你的應用程序之間的某種進程間通信。

總的來說,我會說這聽起來像是一個非常糟糕的主意。

1

您還可以使用CBT Hook觀看窗口創建消息。您將可以訪問用於創建實際窗口的CREATSTRUCT,例如標題和類名稱。您可以防止在您的掛鉤中創建窗口,修改尺寸等。

+0

這隻有在窗口創建時設置窗口標題時纔有效。這是不太可能的。 – 2009-12-22 23:26:09

+0

這取決於他在找什麼。有更多的方法來標識窗口,比如標識,類名和父級等。 – 2009-12-23 00:32:05