簡體   English   中英

如何在不使用CreateWindow(Ex)的情況下創建窗口(HWND)?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM