메인 엑서에 LowlevelMouseProc 및 LowlevelKeyboardProc를 넣을 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1639496

  •  08-07-2019
  •  | 
  •  

문제

다른 프로세스의 맥락에서 후크가 호출되기 때문에 글로벌 Windows Hooks는 DLL에 있어야하므로 후크 절차의 코드를 해당 프로세스에 주입해야합니다. 그러나 있습니다 제한:

SetWindowsHookEx DLL을 다른 프로세스에 주입하는 데 사용할 수 있습니다. 32 비트 DLL은 64 비트 공정에 주입 할 수 없으며 64 비트 DLL을 32 비트 프로세스에 주입 할 수 없습니다. 응용 프로그램에 다른 프로세스에서 후크를 사용해야하는 경우 32 비트 응용 프로그램이 필요합니다. SetWindowsHookEx 32 비트 DLL을 32 비트 프로세스에 주입하고 64 비트 응용 프로그램 통화 SetWindowsHookEx 64 비트 DLL을 64 비트 프로세스에 주입합니다. 32 비트 및 64 비트 DLL의 이름은 다른 이름을 가져야합니다.

이런 이유로 저수준 후크를 사용하고 싶습니다. WH_MOUSE_LL 그리고 WH_KEYBOARD_LL, 대신에 WH_MOUSE 그리고 WH_KEYBOARD. 보았을 때 그들의 선적 서류 비치:

이 후크는 설치 한 스레드의 맥락에서 호출됩니다. 호크를 설치 한 스레드에 메시지를 보내어 호출이 이루어집니다. 따라서 후크를 설치 한 스레드에는 메시지 루프가 있어야합니다.

이로 인해 이러한 특정 후크 절차가 별도의 DLL에있을 필요는 없으며 exe 내부에 살 수 있다고 생각하게됩니다. 그만큼 문서화 SetWindowsHookEx, 그러나 말한다 :

lpfn

in] 후크 절차에 대한 포인터. 만약 dwThreadId 매개 변수는 0이거나 다른 프로세스에 의해 생성 된 스레드의 식별자를 지정합니다. lpfn 매개 변수는 DLL에서 후크 절차를 가리 려야합니다.

두 개의 저수준 후크에 대한 명시 적 예외는 언급되지 않습니다.

별도의 DLL에서 후크 프로 시저없이 저수준 후크를 사용하는 몇 가지 .NET 응용 프로그램을 보았습니다. 그것은 이것이 받아 들일 수 있다는 또 다른 힌트입니다. 그러나 문서가 그것을 금지하기 때문에 나는 이것을 직접하는 것이 조금 무서워합니다.

내가 DLL을 사용하지 않고이 저수준 후크 절차를 내 exe에 바로 넣는 경우 아무도 문제를 예측합니까?

편집하다: 현상금의 경우, 나는 결정적인 "예, 이것은 괜찮습니다."또는 "아니요, 이것은 잘못 될 수 있기 때문에 ..."를 원합니다. "

도움이 되었습니까?

해결책

DLL 규칙에는 글로벌 후크 기능에는 한 가지 예외가 있습니다. 낮은 레벨 마우스 및 키보드 후크는 호출 프로세스의 맥락에서 실행됩니다. 프로세스가 고트가 아닌 프로세스가 아닙니다 (Windows는 Windows 메시지를 통해 후크에 알립니다). 따라서 후크 코드는 임의 프로세스에서 실행되지 않으며 .NET로 작성할 수 있습니다. 보다 http://www.codeproject.com/kb/cs/csllkeyboardhook.aspx 예를 들어.

다른 후크의 경우 32 비트 버전의 Setwindowshookex를 호출하고 32 비트 프로세스에서 후크 함수를 전달하고 64 비트 버전의 Setwindowshookex를 호출하고 64 비트 프로세스에서 후크 기능을 전달해야합니다.

다른 팁

이것이 밝혀졌습니다 ~이다 실제로 문서에서. 문서에 있지는 않지만 SetWindowsHookEx 그리고 친구, 그러나 .NET Knowledge Base 기사.

후크를 설치 한 스레드에서 낮은 수준의 후크 절차가 호출됩니다. 낮은 수준의 후크는 후크 절차를 DLL에서 구현할 필요가 없습니다.

낮은 수준이든 높은 수준이든 각 프로세스에로드 할 수있는 별도의 DLL에 있어야합니다. 당신이 인용 한 문서는 그것을 명확하게 만들고, 저수준 후크에 적용되는 예외가 있다면, 그 문서도 그렇게 말할 것입니다.

경험의 규칙 : 문서가 무언가를하지 말라고 말할 때, 일반적으로 그 이유는 꽤 좋은 이유가 있습니다. 어떤 경우에는 효과가있을 수 있지만, 그것이 작동한다는 사실은 구현 세부 사항이며 변경 될 수 있습니다. 이 경우 구현이 수정되면 코드가 끊어집니다.

편집 : 이전 답변을 되 찾습니다. wh_mouse_ll 및 wh_keyboard_ll은 글로벌 후크에 대한 일반적인 규칙에 대한 예외입니다.

사용 된 Setwindowshookex로 전달 된 Hinstance는 무엇입니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top