2016-07-25 5 views
0

Windows 컴퓨터에서 키보드 및 마우스 사용에 대한 통계를 수집하는 작은 Python 스크립트가 있습니다.Detect SetWindowsHookExA WH_MOUSE_LL 분리/해제 해제

windll.user32.SetWindowsHookExA(win32con.WH_MOUSE_LL, mouse_pointer, win32api.GetModuleHandle(None), 0)을 통해 설정했습니다. 나는 이것을 사용하여 내가 사용하고있는 API를 볼 수있다. 그것은 C++ 프로그래머 일 수도 있습니다.

Android Studio를 사용하여 응용 프로그램을 컴파일 할 때 코어가 4 개인 코어 i7이 모든 코어에서 100 %로 최대치에 도달하면 마우스와 OS가 일반적으로 응답하지 않습니다. Android Studio의 알려진 문제점

보통 매우 높은 CPU로드가 2 초 (4+) 동안 발생하면 WH_MOUSE_LL 후크가 OS에 의해 분리됩니다. "아니요, 우리에게는 시간이 없습니다. 탐색기 (나는 또한 사운드 볼륨 관리자는 분명히 또한 마우스 훅을 등록 PowerMixer라는이 있기 때문에 아래 작업 표시 줄에 마우스 스크롤 휠의 동작을 추적 할 수 있도록 "

내가 파이썬에서이를 비난하지 않는다 등록 취소 다시 .exe Shell_TrayWnd)이 응용 프로그램은 컴파일 후 해당 마우스 훅을 사용할 수 없게합니다.

또한 필자가 컴파일 할 때 스크롤 휠을 지속적으로 스크롤 할 때 (아주 재미있게) 스크롤 소리가 들리므로 매우 낮은 레벨의 시스템 경고음이 울리고 키보드 고리가 등록 취소됩니다.

Windows API를 통해 내 후크가 분리/해제되었는지 어떻게 감지 할 수 있습니까? 필자는 파이썬 특정 답변을 요구하지 않고,이를 처리하기 위해 Win32 API를 사용하는 적절한 방법에 대한 정보만을 제공합니다.

SetWindowsHookEx documentation발언 절은 말한다 : 밖으로 후크 프로 시저의 시간, 시스템이 다음 후크에 메시지를 전달

합니다. 그러나 Windows 7 이상에서는 후크가 호출되지 않고 자동으로 이 제거됩니다. 에 응용 프로그램이 후크가 제거되었는지 여부를 알 수있는 방법이 없습니다.

운이 좋지 않습니까?

업데이트 : 몇 주 후, 한스 파산의 제안이 잘 작동하고 있음을 알리고 싶습니다. 나는 이것을 추천한다. 10.000ms가 약간 높은 것처럼 보이지만, 나는이 값으로 설정하고 부정적인 영향을 미치지 않습니다. 이것은 몇 분 안에 문제 시스템 전체를 해결할 수있는 방법입니다.

+1

그냥 시간 초과를 늘리면 레지스트리 설정입니다. LowLevelHooksTimeout 값인 DWORD를 HKEY_CURRENT_USER \ Control Panel \ Desktop 키에 추가합니다. 시간 제한을 두 배로 설정하려면 10000으로 설정하십시오. –

+0

* "파이썬에서 이것을 비난하지는 않습니다. 왜냐하면 동일한 라이브러리를 사용하는 동일한 조건에서 동일한 동작을 보이는 다른 프로그램도 있기 때문입니다." - 그건 거의 결정적이지 않은 것처럼 보이고, 나는 그 작은 정보를 가진 출처로 아무것도 버리지 않을 것입니다. 안드로이드 스튜디오뿐만 아니라 파이썬 스크립트가 실패하기 시작할 때 미니 덤프를 가져 와서 나중에 분석하십시오. 이것은 흥미로운 정보를 드러 낼 수 있습니다. – IInspectable

+0

@IInspectable 당신이 옳을 수도 있습니다. 하지만이 문제를 디버깅하는 것은 시간과 노력이 필요하지 않습니다. 필자가 언급 한이 사운드 관리자가 똑같은 문제를 가지고 있으며 파이썬으로 작성된 것이 아니라는 사실 때문에 신속한 결정이 내려졌습니다. –

답변

2

어떻게하면 Windows API를 통해 후크가 분리되었거나 분리되었는지 감지 할 수 있습니까?

이 그것을 할 직접 방법은 없으며, 자신의 질문을 백업하는 MSDN 문서 인용

아웃 후크 프로 시저 시간의 경우, 시스템은로 메시지를 전달합니다 다음 훅. 그러나 Windows 7 이상에서는 후크가 호출되지 않고 자동으로 제거됩니다. 응용 프로그램이 후크가 제거되었는지 여부를 알 수있는 방법이 없습니다.

그러나, 간접 방법은 후크가 호출 될 때 마지막 시간을 추적 가질 수 있습니다, 다음 주 응용 프로그램/스크립트는 주기적으로 GetLastInputInfo() 전화하여 추적 시간으로 시간을 비교할 수 있습니다. 그 차이가 레지스트리에 저장된 후크 타임 아웃보다 훨씬 큰 차이가 있다면 (documentation 참조) 아마도 당신의 갈고리가 사라질 수있는 좋은 방법 일 것입니다.

다음 MSDN 블로그 후크 시간 제한의 세부 사항을 설명합니다

Global hooks getting lost on Windows 7

하지만, 가장 중요한 것은 상태 :

내 추천 낮은 수준의 후크는 피해야한다는 것입니다 가능할 때마다. 키 입력을 모니터링하고 차단하지 않으려는 경우 원시 입력을 통해 키보드 입력을 얻을 수 있습니다. 이것은 후크보다 가벼우 며 다른 앱의 응답성에 영향을주지 않으며 은 앱이 응답하지 않는 경우 꺼지지 않습니다..

응용 프로그램이,이 작품을 전달하는 전용 스레드의 고리를 실행해야합니다 낮은 수준의 후크를 사용해야하는 경우 : LowLevelMouseProc()LowLevelKeyboardProc() 문서화에 마이크로 소프트의 추천과 동일

작업자 스레드에 전달한 다음 즉시 반환합니다. 응용 프로그램이 낮은 수준의 후크를 사용해야하는 대부분의 경우 원시 입력을 모니터링해야합니다 (). 원시 입력은 저수준 훅보다 다른 스레드를 대상으로하는 마우스 및 키보드 메시지를 비동기식으로 모니터 할 수 있기 때문입니다. 원시 입력에 대한 자세한 내용은 Raw Input을 참조하십시오.

+0

감사합니다. 매우 도움이됩니다. 나는 Hans Passant가 주석을 달았을 때 타임 아웃을 증가 시켰고 분명히 그것이 작동 중이다. 문제가 여전히 나타나면 수집 된 데이터를 분석하고 데이터베이스에 저장하는 매 15 초마다 호출되는 타이머를 실행 중이므로 확실히 GetLastInputInfo()를 수행 할 것입니다. 그 장소는 그 기능을 포함하는 완벽한 장소가 될 것입니다. 또한 링크 및 추가 정보를 주셔서 감사합니다, 나는 그것에 대한 약간의 시간을 찾을 때 원시 입력 물건으로 전환 수도 있습니다. 정말 좋은 대답입니다. –

+0

그런데 이상한 점은 AutoHotkey가이 문제의 영향을받지 않는다는 것입니다. –

+1

AutoHotKey는 오픈 소스입니다. 어떻게 처리하는지 보려면 [소스 코드보기] (https://github.com/Lexikos/AutoHotkey_L)를 참조하십시오. –