2012-06-25 2 views
3

vb.net의 WindowsHookEx에 문제가 있습니다. 내 PC가 특히 3D 렌더링에서 과부하되는 경우, Windows는 자동으로 키보드 후크를 끊고 내 단축키는 작동을 멈 춥니 다. 나는 주변을 수색했는데 후크가 활성화되어 있는지 또는 연결이 끊어져 있는지를 감지 할 수있는 방법이 없다. 그래서 제공하는이 방법은 Is it possible to detect when a low-level keyboard hook has been automatically disconnected by Windows? 후크 --있다-자동으로-D키보드를 계속 연결하고 분리 할 수 ​​있습니까?

그는 다른 변수에 주기적으로 GetLastInputInfo 저장 GetLastInputInfo를 사용하여 키를 사용하고 그 결과를 비교 될 때 상태 "moodforaday"시도했다. 진드기가 이전 변수보다 훨씬 새로운 경우 해당 연결이 끊어 질 가능성이 높습니다. 그 좋은 방법이지만 진드기는 마우스와 같은 다른 것들로부터 올라갈 수 있습니다. 내 후크 클래스에서 마우스 후크가 없으므로 마우스를 움직일 때 틱 수의 변수를 저장할 수 없습니다. 이제는 훅 클래스의 새로운 인스턴스를 만들고 다시 훅하는 작업을 마쳤습니다. 저장된 틱이 10000 틱만큼 새 틱보다 오래된 지 여부를 매 초 확인합니다.

후크의 새 인스턴스를 계속 만들어도 되나요? 그것은 Hooking/Unhooking을 지속적으로 유지할 것이고, 이것이 Windows에서 문제가 될지 궁금합니다.

또한 누군가 다른 방법으로 훅 연결이 끊어 졌는지 탐지하면이 모든 번거 로움을 해결할 수 있음을 알려 주시기 바랍니다.

+0

음, 그렇게하지 마십시오. 이것이 기계의 구조적 문제인 경우 타임 아웃 값을 높이십시오. HKEY_CURRENT_USER \ Control Panel \ Desktop \ LowLevelHooksTimeout 값입니다. –

+0

다른 클라이언트 컴퓨터에 설치 될 수 없습니다. – Zakukashi

+1

그러면 프로그램에서 문제가있는 것 같습니다. UI 스레드가 1 초 이상 죽지 않도록하십시오. Windows는 주 윈도우를 3 초 후에 "응답 없음"이라고 표시된 유령 창으로 교체합니다. 그 문제를 해결하면 후크를 잃어 버리면 자동으로 해결됩니다. –

답변

0

3D 렌더링을 백그라운드 스레드에서 수행하십시오. Control.Invoke은 UI 컨트롤에 직접 액세스하는 코드에만 사용하십시오.

또는 렌더링을 아주 작은 조각으로 나눌 수 있으며 메시지로 직접 게시하여 메인 스레드에서 처리 할 수 ​​있습니다. 이렇게하면 내부 및 외부 메시지를 모두 처리 할 수 ​​있습니다.

두 경우 모두 응용 프로그램이 적시에 응답 할 것이므로 Windows는 응답하지 않는 것으로 간주 할 이유가 없으며 키보드 바로 가기가 그대로 유지됩니다.

관련 문제