2012-09-03 72 views
2

我目前正試圖抓住所有用戶輸入到Windows計算器應用程序。看起來,這樣做的方法是使用Win32攔截計算器窗口中的所有鍵盤和鼠標輸入。我已閱讀下面鏈接的子類窗口的MSDN頁面,並對子類化進行了一些研究。Win32的子類現有窗口

我有用於子類化窗口的語法,但我不知道如何告訴程序我正在尋找子類的窗口。

我到目前爲止的代碼列在下面。我現在的問題是我不確定變量「hWndEdit」是如何分配的。我對Win32編程非常新,所以對此有所幫助。

(鏈接) http://msdn.microsoft.com/en-us/library/windows/desktop/ms633570(v=vs.85).aspx

WNDPROC wpOrigEditProc; 

wpOrigEditProc = (WNDPROC) SetWindowLong(hWndEdit,GWL_WNDPROC,(long) WndEditProc); 

LRESULT CALLBACK WndEditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
     { 
     case WM_CHAR: 
     case WM_KEYUP: 
     case WM_KEYDOWN: 
      if (hWnd == hWndEdit) 
       return 0; 
     break; 
     case WM_DESTROY: 
      // Remove the subclass from the edit control. 
      SetWindowLong(hWndEdit, GWL_WNDPROC, (LONG) wpOrigEditProc); 
     break; 
     default: 
      return CallWindowProc((WNDPROC) wpOrigEditProc, hWnd, message, wParam, lParam); 
     } 
    return CallWindowProc((WNDPROC) wpOrigEditProc, hWnd, message, wParam, lParam); 
} 
+2

讓我們稍微退一步。在截獲Calc的輸入是解決方案時,您試圖解決的問題是什麼? –

+0

您即將與此長期合作。你不僅要求提供一個窗口過程的子類,還要求在一個甚至不屬於你的過程中進行。有辦法做到這一點,但如果你剛開始使用Win32編程,你可能會弄溼你的腳或者至少讀更多。通過鉤子和/或注射進行二級過程子類化不是爲了嘲笑心臟。 – WhozCraig

+1

在你自己的過程中對窗口進行子類化是一個非常標準的winapi技術。在另一個進程中進行子類化的時候絕對不是,它需要在進程中注入一個DLL。如果你甚至不能*找到你想要子類的窗口,那麼你在實際操作中就會有點失落。改變另一個沒有源代碼的程序的行爲只是不常見的做法。主要是因爲對您的控制之外的此類程序的簡單更新會破壞您的代碼。 –

回答

0

要找到一個窗口,先用間諜++(即獲取與Visual Studio已安裝的工具)來查找類名和計算器主窗口的窗口名。然後,在你的應用程序,使用FindWindow API:

hWndEdit = FindWindow(className, windowName); 

雖然,我不知道該子類是這裏的正確方法,因爲計算器窗口沒有您的應用程序擁有。你應該這樣做,hooks

+0

請注意,calc有很多按鈕和其他控件。那些將是單獨的窗口。根據這個子類應該做什麼,它可能需要將它們全部子類化。 –

+0

我會研究鉤子,謝謝你的建議。我會讓你知道它是怎麼回事。 – David