是否可以繼承另一個應用程序的控件,以便我的應用程序可以在另一個應用程序執行代碼並接收lParam和wParam之前執行某些操作?例如:記錄記事本的編輯控件和用戶輸入時能夠知道用戶輸入的內容?如果我提供記事本的編輯控件的hWnd,SetWindowSubclass會工作嗎?我會收到所有消息的lParam和wParam嗎?子類別的另一個應用程序的控制?
謝謝
是否可以繼承另一個應用程序的控件,以便我的應用程序可以在另一個應用程序執行代碼並接收lParam和wParam之前執行某些操作?例如:記錄記事本的編輯控件和用戶輸入時能夠知道用戶輸入的內容?如果我提供記事本的編輯控件的hWnd,SetWindowSubclass會工作嗎?我會收到所有消息的lParam和wParam嗎?子類別的另一個應用程序的控制?
謝謝
是的,如果您的代碼在應用程序的進程中運行,那很容易。你可以用DLL做到這一點。您只需使用帶GWLP_WNDPROC的GetWindowLongPtr即可獲取應用程序的窗口功能,並使用SetWindowLongPtr來設置您自己的窗口功能。在你的窗口函數中,你檢查你想改變的消息,並用改變後的值調用應用程序的窗口函數。如果有其他消息,你必須直接調用它。使用CallWindowProc來調用窗口funcion,因爲默認的windows函數不是一個指針。
另一種方法是使用CallWndProc鉤子函數。用WH_CALLWNDPROC調用SetWindowsHookEx來安裝它。儘管如此,還沒有嘗試過這個,但你不需要進入這個過程的空間,IIRC。
不,不是那麼簡單。在MSDN page for SetWindowSubclass警告說明確:
警告不能使用子類的輔助功能,以繼承跨線程
This article outlines the process一個窗口,把代碼注入其他進程,但基本概括,你需要:
CreateRemoteThread
和LoadLibrary
,或一旦你的代碼在遠程運行過程中,可以使用SetWindowLongPtr
子類的窗口,然後使用普通的IPC技術(命名管道等)與溝通您的過程(如果需要)。