2012-12-28 18 views
5

Próbowałem napisać małe narzędzie, które zmieni granice miejsca, w którym moja mysz może przejść na cały ekran. Użyłem globalnej biblioteki przechwytującej myszy, którą znalazłem here (używam wersji 1), a następnie przekazuję informacje o pozycji myszy od zdarzenia, które generuje do mojej własnej funkcji (wystarczy test, aby sprawdzić, czy działa na razie) .Ustaw pozycję myszy nie działa C#

internal void ProcessMouseEvent(System.Drawing.Point point) 
{ 
    Cursor.Position = new Point(50,50); 
} 

Po uruchomieniu go, mysz wydaje się pulsować do określonego punktu, ale natychmiast powrócić do miejsca, gdzie to było przed zmianą, jeśli było to wydarzenie ruch. Tylko wtedy, gdy zostało to zrobione poprzez kliknięcie, faktycznie pozostaje w nowej pozycji.

Odpowiedz

3

Aby ograniczyć miejsce, w którym mysz może pracować wydajnie, należy użyć funkcji cursor.clip. Możesz znaleźć jego dokumentację here. Będzie robić to, co chcesz, znacznie łatwiej i jest to zalecany sposób.

+0

Co zrobić, jeśli moje granice nie są prostokątne? – littlerat

+0

@littlerat Twoje pytanie nie wspominało o kręgu. Musisz użyć prostokąta z kursorem.clip. Przepraszam! – FrostyFire

+0

Cóż, to też nie jest okrężne. Próbuję zrobić to [to] (http://i.imgur.com/6lpmk.jpg) w [to] (http://i.imgur.com/KhWb0.jpg) bez faktycznej zmiany rozdzielczości ekranu. – littlerat

3

Problem polega na tym, że haczyk przesyła komunikat wiadomości myszy. Ale nie uniemożliwia przetwarzania przez aplikację, która będzie faktycznie przetwarzać powiadomienie. Jest to normalne, a myszka porusza się tam, gdzie chce. To, co musisz zrobić, to zablokować przekazywanie wiadomości, która wymaga zwracania niezerowej wartości z wywołania zwrotnego.

Biblioteka nie zezwala na majsterkowanie z wartością zwrotną oddzwaniania, wymaga operacji. Uważaj, że jest błędny. Zamiast tego użyję this sample code. Z tej próbki metody wywołania zwrotnego:

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { 
    if (nCode >= 0 && MouseMessages.WM_MOUSEMOVE == (MouseMessages)wParam) { 
     System.Windows.Forms.Cursor.Position = new Point(50, 50); 
     return (IntPtr)1; // Stop further processing! 
    } 
    return CallNextHookEx(_hookID, nCode, wParam, lParam); 
} 

I zobaczysz go teraz solidnie zablokowane. Użyj Alt + Tab, Alt + D, E, aby odzyskać kontrolę.

+0

Doskonałą odpowiedzią jest to, że dodałem 'return new IntPtr (1)' tylko raz zaraz po ustawieniu pozycji kursora i pozostało na miejscu i nadal pozwalało użytkownikowi na poruszanie myszą w kolejnych zdarzeniach. –