초기 프로그램에서 생성 된 모든 GUI 프로그램에서 활동을 모니터링하고 설정된 시간 동안 비활성 상태가되면 해당 프로그램을 강제 종료하려고 시도했습니다. 사용자가 잠시 동안 다른 프로그램을 사용하고 있어도 (초기 프로그램에서 생성되지 않아도) 프로그램을 닫아야하므로 시스템 활동이 될 수 없습니다. 응용 프로그램 스폰 프로세스는 .Net 프로그램이며 변경되지 않습니다. 나는 SetWindowsHookEx
낮은 수준의 후크 (WH_KEYBOARD_LL
및 WH_MOUSE_LL
)에서 설정할 수있었습니다. 닷넷하지만 난 (사용 System.Diagnostics.Process
) 시작한 프로세스와 메시지를 연결하는 방법을 잘 모르겠습니다. 후킹을 수행하는 응용 프로그램에서 이벤트를 후크 수 있습니다. 하지만 생성 된 프로그램의 특정 스레드에 연결하려고 시도하면 항상 실패합니다.스폰 된 프로세스의 활동을 어떻게 모니터 할 수 있습니까?
가장 가까운 곳은 .Net 프로그램 대신 SetWindowsHookEx
을 호출하는 C++ DLL을 작성한 것입니다. 이 메서드를 사용하여 생성 된 notepad.exe의 첫 번째 스레드에 연결할 수 있지만 콜백 함수는 호출되지 않습니다. 스레드 ID 0을 지정하면 원래 응용 프로그램에 활동이있을 때 콜백이 호출되므로 해당 경우 SetWindowsHookEx
이 작동합니다.
아직 완전히 후크를 이해하지 못 하겠지만, dll 콜백 함수 주소가 걸려있는 프로세스에 의미가 없기 때문에 내가 읽은 것에서는 작동하지 않습니다. 그게 제가 달리고있는 문제입니까? 그렇다면이 문제를 해결할 수있는 방법이 있습니까? 아니면 스폰 된 프로세스가 적극적으로 사용되고 있는지 판단 할 수있는 방법을 제안 해 줄 수 있습니까?
닷넷 (C#을) 코드 :
private const int WH_MOUSE = 14;
[DllImport("TestHook.dll", EntryPoint="InitializeHook", SetLastError=true, CharSet=CharSet.Unicode, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
private static extern bool InitializeHook(uint hookType, int threadID);
private void HookEm() {
//...
System.Diagnostics.Process testProcess = System.Diagnostics.Process.Start("notepad");
if(!InitializeHook(WH_MOUSE, testProcess.Threads[0].Id)) // The notepad.exe thread I know hooks
MessageBox.Show("Boom!");
//...
}
C++ DLL이 모두는 현재 32 비트 Windows XP 컴퓨터에서 수행되는
HHOOK hookValue;
bool InitializeHook(UINT hookID, int threadID) {
//... Determining which callback to use
hookValue = SetWindowsHookEx(hookID, (HOOKPROC)MouseHookCallback, _dllInstance, threadID);
//...
return hookValue != NULL
}
static LRESULT CALLBACK MouseHookCallback(int code, WPARAM wparam, LPARAM lparam) {
//From what I can see, this is never touched when hooking a thread on an outside process
}
. 필자는 64 비트 응용 프로그램을 생성하기 위해서는 별도의 64 비트 dll이 필요하다는 것을 알고 있습니다.
실제'InitializeHook'는 적절한'SetWindowsHookEx' 결과를 리턴합니까? – Rost
C++ dll은'SetWindowsHookEx'의 반환 값을 추적하고'InitializeHook'의 반환 값은'SetWindowsHookEx'가 null이 아닌 값을 반환 할 때만 true입니다. – BlueBayliss