![](/img/trans.png)
[英]Can I use Find window without using RegisterClass and CreateWindow
[英]How can I create a window (HWND) without using CreateWindow(Ex)?
我正在使用代理DLL攔截對CreateWindowExA
/ CreateWindowExW
調用。 除某些應用程序(最著名的是一些Visual Basic 6應用程序)似乎能夠創建窗口而無需通過這兩個功能中的任何一個功能之外,該工作效果很好。 像Spy ++這樣的工具都可以顯示Window,但是我的鈎子函數卻沒有注意到它們。
我的第一個懷疑是,也許這些(舊的)應用程序使用CreateWindowA
/ CreateWindowW
創建窗口,但是至少對於我的編譯器(MSVC6至MSVC10)而言, CreateWindow
只是#define; 文檔的備注部分對此進行了確認。
我的第二個想法是,我可以使用SetWindowsHookEx
安裝CBT hook
來檢測窗口的創建。 但是,結果是相同的:此鈎子注意到與我的鈎子API函數相同的窗口,但沒有注意到Spy ++中可見的所有窗口。
所以我的問題是:是否可能有一段時間CreateWindowA
/ CreateWindowW
不是#define,而是真正的函數? 還是出於兼容性原因,此函數是否仍由user32.dll
導出? 如何獲取此函數的句柄以將其掛鈎?
或者是否存在其他一些可能未記錄的函數可用於創建函數,例如可以使用NtCreateProcess
代替CreateProcess
?
三個簡單的猜測:
1)VB應用程序是否真的在后台調用了“ DialogBox” API(例如DialogBoxParam,CreateDialogIndirect等)?
2)您正在運行64位操作系統,並且正在掛接64位user32.dll。 因此,不會吸引32位應用程序。 在c:\\ windows \\ syswow64中有一個user32.dll的32位副本
3)您沒有鈎住應用程序正在使用的user32.dll。 許多較舊的應用程序可能正在獲得某些DLL重定向。 在命令提示符下,從c:\\ windows \\ winsxs目錄執行“ dir / s user32.dll”。 您將在此處看到至少一個其他的user32.dll副本。 忘記這種情況了,但是您可以Bing for“ winsxs”,並獲得一些頁面來討論並行目錄如何解決較新的Windows OS版本上的兼容性問題。
我懷疑#3是您遇到問題的原因。
我認為您的問題可能是VB應用程序正在使用GetProcAddress()調用CreateWindow **()函數。 如果鈎住GetProcAddress,則應該可以確認這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.