2010-07-12 2 views
3

현재 프로세스에서 마우스 메시지를 가져 오기 위해 다음 코드를 사용하고 있습니다.WH_MOUSE_LL이있는 SetWindowsHookEx가 마우스를 몇 초 동안 속도를 늦춤니다.

using (Process curProcess = Process.GetCurrentProcess()) 
using (ProcessModule curModule = curProcess.MainModule) 
{ 
    return SetWindowsHookEx(WH_MOUSE_LL, proc, GetModuleHandle(curModule.ModuleName), 0); 
} 

이 코드가 실행되면 마우스가 몇 초 동안 느려지고 정상으로 돌아옵니다.

아이디어가 있으십니까?
감사

편집 - 후크 방법

private static IntPtr mouseEvent(int nCode, IntPtr wParam, IntPtr lParam) 
{ 
    if (nCode >= 0 && MouseMessages.WM_LBUTTONDOWN == (MouseMessages)wParam) 
    { 
     MSLLHOOKSTRUCT hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));  
     LastLeftClick = new ClickInfo { Time = DateTime.Now, X = hookStruct.pt.x, Y = hookStruct.pt.y }; 
    } 
    return CallNextHookEx(hookID, nCode, wParam, lParam); 
} 

public class ClickInfo 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 
    public DateTime Time { get; set; } 
} 
+0

릴리스 모드에서도 이러한 현상이 발생합니까? –

+0

@Patrick Klug : 릴리스 모드에서도 가능합니다. –

+2

'WH_MOUSE_LL'은 Windows가 모든 마우스 이벤트를 응용 프로그램에 전달하고 처리 할 때까지 기다린 다음 정상적으로 계속해야합니다. 마우스 메시지 - 특히 고해상도 마우스를 가지고있는 경우 - 빠르게 빠르게 분노합니다. * 신속하게 파견되지 않으면 쌓일 시간이 오래 걸리지 않습니다. 그리고 콜백이 처음 호출 될 때, 그것은 아마도 신속하게 응답하지 않을 것입니다 : 당신의 프로세스는 먼저 자신의 처리를 수행해야하고 런타임은 콜백과 CallNextHookEx()에 대한 P/Invoke 호출을 JIT해야합니다. – Shog9

답변

2

무엇 당신의 후크 프로 시저가 생겼는데? 내가 같은 문제 (만은 C++의 프로젝트가 아닌 C#을의)를했고, WH_MOUSE에 WH_MOUSE_LL에서 훅을 변경하여 해결 http://msdn.microsoft.com/en-us/library/system.windows.forms.application.addmessagefilter.aspx

+0

문제는 마우스 이벤트 프로세스가 아니라 등록 자체에있는 경우 프로 시저가 어떻게 생깁니 까? –

+0

등록하는 동안 마우스를 움직이지 않도록 조심하지 않으면 (버튼 클릭에 응답하여 호출됩니까?), 안정된 마우스를 가지고 있습니다 (일부 마우스, 특히 공이없는 마우스는 시끄 럽습니다), 후크 절차 즉시 호출 될 수 있습니다. – Tergiver

+0

나는 후크가 즉시 호출되는 것 같지만 속도 저하는 등록시에만 발생하며 다른 후크 호출에는 없다. –

2

(:

프로세스가 하나 개의 UI 스레드가있는 경우는, 대신에 메시지 필터를 사용 낮은 수준에서 정상 수준으로). WM_LBUTTONUP 및 WM_RBUTTONUP 메시지의 경우 정상적으로 작동합니다.

저를 괴롭히는 점은 WH_MOUSE_LL 코드가 내가 작성한 시점에서 정상적으로 작동하고 있었기 때문입니다 (마우스가 멈추지 않아도 됨). Windows 용 보안 업데이트가 마우스 후크와 이전의 미세한 코드의 동작이 변경된 것처럼 보입니다. 문제.

+0

'WH_MOUSE'는 전혀 작동하지 않습니다 :) –

+0

아니, 그렇지 않습니다. –

2

당신의 후크가 비싸다. 왜, 어떻게 고칠지를 알아 내야합니다.

코드가 매우 작아 보이더라도 JIT 또는 페이징으로 인한 지연을 유발하는 초기 C# interop 비용이 있다고 의심됩니다.

이 스레드에서 가능한 한 많은 처리를 수행하도록 코드를 변경하면 문제가 해결됩니다. C++ 개발자는 저수준의 후크가 매우 민감하기 때문에 Marshal.PtrToStructure에 대해 걱정하기도합니다.이 작업이 마우스 움직임을 손상시키지 않을 정도로 저렴하다는 것이 내 머리 꼭대기에서 말할 수는 없습니다.

이전에는 저수준 마우스 훅을 사용했고 (C++에서는) 훅 프로 시저 자체가 비싸지 않으면 문제가 발생하지 않았습니다. C++에서는 나머지 처리를 수행하는 HWND에 PostMessage 이상을 수행하는 것을 피하려고합니다.

+0

IMHO 문제가 있다면 모든 후크 호출 (기본적으로 내 프로세스의 살아있는 시간)에 문제가 발생했습니다. 첫 번째 제안에 대해 -이 문제를 조사하는 방법을 알고 있습니까? –

+0

아마 근본 원인에 도달하는 가장 좋은 방법은 'xperf'와 같은 도구를 사용하여 시스템에서 무슨 일이 일어나고 있는지 확인하는 것입니다. 이렇게하면 마우스가 멈추는 지점에서 어떤 일이 일어나고 있는지 직접 확인할 수 있습니다. http://msdn.microsoft.com/en-us/performance/cc825801.aspx 세계에서 가장 사용하기 쉬운 도구는 아니지만 그다지 어렵지 않으며 무료입니다. –

1

후크 이벤트를 받으면 책을 끈 다음 작업을 수행하고 실제로 필요한 경우 후크를 다시 넣습니다.

이렇게하면 마우스가 뒤쳐지지 않습니다.

정말로 필요할 때만 푹 빠져 있어야합니다.

+0

내가 후크를 처음 설정할 때만 마우스가 뒤쳐져 있기 때문에 도움이 될지 의심 스럽다. –

2

마우스의 낮은 수준의 후크 반응을 설정하면 주 스레드가 반응하는 데 의존하게되고 흔히 실수는 시작 프로세스 초기에 후크를 설정하는 것입니다.

SetHook
LongRunningStartupProcess
마우스를 여기

를 시작할 때까지 그것이 시동 프로세스의 마지막에 발생하므로 스레드에 후크를 파견하는 것이 가장 좋습니다 반응하지 않습니다.Dispatcher.CurrentDispatcher.BeginInvoke(new Action(SetHook));

DispatchSetHook
LongRunningStartupProcess
SetHook (콜백)
마우스가 응답하지

이 아직도 그와 같은 장기 실행 프로세스를하지 않는 메인 스레드을 보장하기 위해 응용 프로그램 내에서 지속적인 관리에 문제가 있습니다 마우스도 잠급니다. 이것은 후크를 설정 한 다음 주 스레드에서 Thread.Sleep을 수행하여 쉽게 확인할 수 있습니다.

관련 문제