2013-03-04 15 views
6

Powrót w 2010, Pierre pytanie this pytanie (jego zaakceptowana odpowiedź nie działa dla mnie).Symulowane MouseEvent nie działa poprawnie OSX

Mam ten sam problem: jestem w stanie skutecznie przesunąć mysz (i wyłączyć!?!) Ekranowo programowo z mojej aplikacji kakao, jednak przenoszenie myszy do położenia mojej stacji dokującej nie jest wyświetlane to (i niektóre inne aplikacje nie rejestrują zdarzenia myszy przeniesiony, np gier, które usuwają myszki).

Sposób używam jest tak:

void PostMouseEvent(CGMouseButton button, CGEventType type, const CGPoint point) 
{ 
    CGEventRef theEvent = CGEventCreateMouseEvent(NULL, type, point, button); 
    CGEventSetType(theEvent, type); 
    CGEventPost(kCGSessionEventTap, theEvent); 
    CFRelease(theEvent); 
} 

i wtedy, kiedy chcę, aby przesunąć mysz, którą uruchamiam:

PostMouseEvent(0, kCGEventMouseMoved, mouseLocation); 

Należy zauważyć, że ten kod generuje zdarzenia mouseover dla rzeczy takich jak łącza.

Czy to już 2013, czy można naprawić ten problem?

Dziękujemy za poświęcony czas!

Odpowiedz

0

OK, więc oczywiste jest, że MacOSX musi znajdować się dokładnie na brzegu ekranu, aby stacja dokująca się wyświetliła! Ponieważ Trzymam doku na lewej stronie ekranu (z powodu wielu programów utrzymywanie istotnych przycisków w dolnej części okien), wszystko, co musiałem zrobić, to powiedzieć

if (mouseLocation.x < 0) 
{ 
    mouseLocation.x = 0; 
} 

I udało się!

Używam także pomysłu KenThomases do wypaczenia kursora.

(ta odpowiedź jest zaznaczone poprawne, gdyż pozwala mi pokazać dokującą - jednak nadal istnieją pewne aplikacje, które nie reagują na mysz)

+0

Powinieneś wziąć pod uwagę inne krawędzie ekranu. Podobnie, w przypadku wielu monitorów punkt początkowy ekranu może zawierać elementy ujemne. –

+0

Tak, zrobię to. OK, nie wiedziałem o dodatkowych monitorach ... Dzięki! (mój projekt będzie korzystał z dodatkowych monitorów ... Na szczęście mi to powiedziałeś!) –

3

Obydwu pomylę kursor i wygeneruje ruch myszy. Z doświadczenia wiem na przykład, że wypaczenie kursora, gdy nie generuje ono zdarzenia, modyfikuje kolejne zdarzenie przenoszenia myszy, aby uwzględnić przesuniętą odległość w jego delcie myszy. Nie wiem, czy twoje zsyntetyzowane zdarzenie przenoszenia będzie zawierało właściwe wartości delta we własnym zakresie.

+1

Dodanie 'CGWarpMouseCursorPosition (punkt);' u dołu PostMouseEvent metoda nie pomogła - czy to masz na myśli? –

+1

Dodanie to teleportuje mysz do (0,0), jeśli dotknie krawędzi ekranu. –

+1

No cóż, zwróciłbym uwagę przed opublikowaniem zdarzenia, ponieważ wypaczenie dodaje deltę do następnego zdarzenia. Nie można powiedzieć, dlaczego miałoby dojść do (0, 0), jeśli nie o to chodziło. –