2010-02-19 9 views
0

우리는 저수준 키보드 후크를 수행하는 .Net 응용 프로그램에서 작업하고 있습니다. 디버거 내부에서 실행되는 SetWindowsHookEx를 호출하면 호출이 항상 실패합니다.VS2008 디버거에서 SetWindowsHookEx를 호출하면 항상 NULL이 반환됩니다.

컴파일 된 실행 파일에서 실행하면 모든 것이 잘 동작합니다. 우리가 프로세스에 연결하면 SetWindowsHookEx가 호출되어 모든 것이 작동합니다.

저는 VS가 이미 저수준 키보드 후크를하고 있지만, CallNextHook 함수가 있기 때문에 문제가되어서는 안된다는 것을 기억합니다.

누군가 무슨 일이 일어나고 있는지 알고 있습니까?

편집 : 코드는 꽤 어렵습니다. 디버거 내부에는 예외가 발생하지만 외부에는 예외가 발생합니다.

Public Sub New() 
    m_callback = New NativeMethods.KeyboardHookDelegate(AddressOf KeyboardCallback) 
End Sub 

Public Sub Start() 
    m_handle = NativeMethods.SetWindowsHookEx(NativeMethods.HookType.WH_KEYBOARD_LL, m_callback, Marshal.GetHINSTANCE(Reflection.Assembly.GetExecutingAssembly().GetModules()(0)).ToInt32, 0) 
    If m_handle = 0 Then 
     Throw New Exception() 
    End If 
End Sub 
+0

디버거를 사용할 때 실패한 적이 한번도 없었습니다. 다른 일이 벌어지고있다. 도움이 필요하면 우편 번호를 게시하십시오. –

답변

2

VS에서 리플렉션에서 다르게 나타날 수있는 .vshost.exe 프로세스가 실행되고있을 수도 있지만 확실히 말할 수는 없습니다. 우리는 'Process.GetCurrentProcess() .MainModule`을 사용하여 모듈을 전달합니다. 아마도 시도해 볼 수 있습니다.

+0

어쨌든 나는 당신의 Process.GetCurrentProcess()를 사용할 것입니다. MainModule은 훨씬 깨끗해 보입니다. –

+0

코드를 변경할 때 InPtr 대신 Int를 사용하여 PInvoke가 잘못 되었음이 발견되었습니다. 또한 GetModuleHandle을 사용하기 시작합니다. 나란히 두 가지 모두 앱이 VS 내부에서도 작동합니다. –

관련 문제