2012-09-12 5 views
3

초기 프로그램에서 생성 된 모든 GUI 프로그램에서 활동을 모니터링하고 설정된 시간 동안 비활성 상태가되면 해당 프로그램을 강제 종료하려고 시도했습니다. 사용자가 잠시 동안 다른 프로그램을 사용하고 있어도 (초기 프로그램에서 생성되지 않아도) 프로그램을 닫아야하므로 시스템 활동이 될 수 없습니다. 응용 프로그램 스폰 프로세스는 .Net 프로그램이며 변경되지 않습니다. 나는 SetWindowsHookEx 낮은 수준의 후크 (WH_KEYBOARD_LLWH_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이 필요하다는 것을 알고 있습니다.

+0

실제'InitializeHook'는 적절한'SetWindowsHookEx' 결과를 리턴합니까? – Rost

+0

C++ dll은'SetWindowsHookEx'의 반환 값을 추적하고'InitializeHook'의 반환 값은'SetWindowsHookEx'가 null이 아닌 값을 반환 할 때만 true입니다. – BlueBayliss

답변

1

비슷한 문제가 발생한 사람은 GetWindowThreadProcessId(GetForegroundWindow(), ref foregroundWindowProcessId)을 사용하여 간격으로 전경 윈도우를 확인하고 생성 된 프로세스 ID 맵을 유지해야합니다. 이 타이머가 작동 할 때마다 우리는 CallNextHookEx을 호출하는 함수를 검사하기 위해 부울 값을 설정합니다.이 함수는 효율적이거나 빠르거나 윈도우가 우리를 푸시 (unhook) 할 것이기 때문에 호출해야합니다. 그런 다음 위의 부울 값을 사용하고 시스템에서 SetWindowsHookEx의 후크를 사용하여 사용자가 Google 애플리케이션에서 활성 상태인지 확인합니다. 이 솔루션에는 C++ dll이 필요하지 않습니다.

관련 문제