프로그램 메인 창에 채팅 UI를 구현하기 위해 DLL을 프로그램에 삽입했습니다. 응용 프로그램 주 창 핸들을 가져온 다음 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
을 log 명령으로 바꿨을 때 작동하지 않았습니다. 나는 다른 곳에서 작동하기 때문에 내 로그 작업을 알 수 있습니다. 나는 이것으로 무슨 일이 일어나고 있는지 극도로 혼란 스럽다.
메인 윈도우를 얻는 다른 방법이 있습니까? (생성 될 때가 좋음)? 아니면 내 후크 방식이 좋지만 잘못 실행 한 것입니까? 의견을 보내 주셔서 감사합니다.
와우, 이것은 유망 해 보인다. 나는 아직 내 자신을 작성하지 않았기 때문에 해킹 게임용으로 설계된 DLL 인젝터를 사용하고 있었다. 하지만 지금 이것을 사용하여 글을 쓸 것입니다. 고맙습니다! – smoth190