我已經將一個DLL注入到程序中,以在應用程序主窗口上實現聊天UI。我想我可以獲得應用程序的主窗口句柄,然後獲取它的DC,並繪製到它上面。該窗口有一個可預測的標題,這意味着我可以使用FindWindow
來獲取句柄。唯一的問題是,DLL在進程啓動時被注入。那時候,這個窗口還沒有被創建。這意味着FindWindow
找不到任何東西!如何從注入的DLL獲取程序窗口?
這是什麼解決方案?我可以在DLL中創建一個線程並休眠一段時間,直到我知道窗口被創建了嗎?這看起來很不穩定,所以我寧願不這樣做。
我試圖做的是在DLL中使用SetWindowsHookEx
來掛鉤全局WndProc。我可以掃描這些消息,直到我從我的窗口中找到一個消息(這意味着它已經創建)。然後我可以保存手柄並繼續執行我的程序。我並不擔心當時有多個同名的窗口。唯一的問題是我的鉤子永遠不會被調用。
我創建這樣的鉤:
m_hWndProcHook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)WndProc, m_hModule, 0);
if(!m_hWndProcHook)
{
oss << "Failed to set wndproc hook. Error code: " << GetLastError();
Log(oss.str().c_str());
return false;
}
返回一個有效掛鉤。 WndProc中是這樣的:
LRESULT CALLBACK CChatLibrary::WndProc(int code, WPARAM wParam, LPARAM lParam)
{
CWPSTRUCT* pData;
ostringstream oss;
char wndName[256];
gChatLib->Log("WNDPROC");
if(code < 0)
return CallNextHookEx(gChatLib->GetWndProcHookHandle(), code, wParam, lParam);
else
{
//Get the data for the wndproc
pData = (CWPSTRUCT*)lParam;
//Log the message
GetWindowText(pData->hwnd, wndName, 256);
oss << "Message from window \"" << wndName << "\"";
gChatLib->Log(oss.str().c_str());
return CallNextHookEx(gChatLib->GetWndProcHookHandle(), code, wParam, lParam);
}
}
但沒有「WNDPROC」的消息登錄到我的日誌文件...早些時候,我有一個MessageBox
,而不是一個日誌,看看它的工作,這竟然是一個可怕的想法。所有程序都凍結了,因爲他們在等我點擊「OK」,我不得不做一次硬復位......當我重新啓動計算機並用日誌命令代替MessageBox
時,它不起作用。不過,我知道我的日誌作品,因爲它可以在其他地方使用。我非常困惑與這發生了什麼。
是否有任何其他方法獲得主窗口(最好是創建時)?或者,我的鉤子方法不錯,但剛執行錯誤?感謝您的任何反饋。
哇,這看起來很有前途:)我使用的DLL注入器專爲黑客遊戲而設計,因爲我還沒有自己寫過。但我現在用這個寫一個。謝謝! – smoth190