![]() |
![]() |
|
|
|||||||
| Programmierung Rat & Tat für Programmierer |
![]() |
|
|
Themen-Optionen | Ansicht |
|
|
#21 | |
|
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.631
|
Zitat:
|
|
|
|
|
|
|
#22 |
|
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.631
|
Du mußt nach dem translatePoint ein postEvent(event) aufrufen, das macht das gleiche wie - PostMessage unter Windows, beispielsweise. Dem Betriebssystem wird durch das postEvent(event) mitgeteilt ein SetCursorPos erst jetzt explizit - unter Windows z.B. - auszuführen.
|
|
|
|
|
|
#23 | |
|
Hero
![]() |
Zitat:
2. Jedes Objekt, das auf Bewegungen des Mauszeigers reagieren soll, muß sich als Mouse-Listener angemeldet haben. Falls die Maus über dem Objekt etwas tut, wird das Objekt entsprechend darüber informiert.
____________________________________
Bibel |
|
|
|
|
|
|
#24 |
|
Elite
![]() |
hmm, ich weiß nicht
für mich is n treiber die schnittstelle zwischen hardware und OS und deshalb geräteabhängig. n server is zB für mich n im hintergrund laufendes programm. aber ich glaub ich werd trotzdem was treiberähnliches programmieren müssen. das mit dem MouseListener stimmt nur bedingt glaub ich. für die Bewegungen selbst ist der MotionListener verantwortlich, der MouseListener erkennt nur die tasten bzw das mouseEntered und mouseLeaved. ändert jedoch leider nichts an der tatsache dass es nicht mit java geht. |
|
|
|
|
|
#25 |
|
Hero
![]() |
geht es ja mit DirectX SDK
Dort sollte es etwas geben, mit dem du direkt die Tastatur abfragst und eine Mouse-Move-Message an alle Anwendungen schicken kannst. ![]()
____________________________________
Bibel |
|
|
|
|
|
#26 |
|
Veteran
![]() Registriert seit: 21.07.2001
Alter: 45
Beiträge: 404
|
das wäre ja gelacht, wenn man einen cursor nicht setztn kann wo man will!!
in der klasse Cursor hast du schon nachgeschaut - wie ich vermute ich werd mich mal ein wenig auf die suche machen, aber heute nicht mehr (GÄÄÄHHHHN ...) |
|
|
|
|
|
#27 |
|
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.631
|
Die Lösung des Problems stellt sich folgendermaßen dar:
1. Eine systemweite Hookfunktion für die Tastaturnachrichten einrichten 2. In dieser Hookfunktion werden die gewünschten Tastencodes für die zu generierenden Mauszeigerversatz (Positionierung) Nachrichten / Funktionsaufrufe ausgefiltert und zur Steuerung des Mauszeigers herangezogen. D.h. es wird mittels switch Anweisung und case Fällen die entsprechende Positionsveränderung durchgeführt. Unter Java passiert dies mit der Erzeugung eines Mausevents mittels new und dem Aufruf von translatePoint sowie dem Einreihen der Nachricht in der Ereigniswarteschlange (Event Queue) mit postEvent. Das ganze soll sich ja auf den Desktop beziehen, im Übrigen auch auf alle Anwendungen, im übrigen auch auf alle Fenster aller Anwendungen. Insofern muß man eine systemweite Hookfunktion auf die Tastatur einrichten. Wie geschieht das ganze in der Praxis, warum Java ? besser in einfachem C, da funktioniert es wenigstens einfach:*) Hookfunktion einrichten Code:
MyKeybdHookHandleNr=SetWindowsHookEx( WH_KEYBOARD, /* es handelt sich um eine Tastaturnachrichtabfangprozedur, type of hook to install */ MyBliBlaTralalaKeybdHookFunktion, /* address of hook procedure */ NULL, /* handle of application instance, systemwide so NULL */ NULL); /* identity of thread to install hook for, systemwide so NULL, das bedeutet für alle Prozesse und Unterprozesse */ Code:
LRESULT CALLBACK MyBliBlaTralalaKeybdHookFunktion(
int code, /* hook code */
WPARAM wParam, /* virtual-key code */
LPARAM lParam) /* keystroke-message information */
{
POINT mauspos;
int repeat_count;
if(code<0) return CallNextHookEx(MyKeybdHookHandleNr,code,wParam,lParam);
/* CallNextHookEx wird, wenn code<0 ist, mit den jetzigen Parametern aufgerufen, ist eigentlich nicht notwendig, denn hier wird ein systemweiter Hook behandelt, das ist Programmierer Jägerlatein, oder anders ausgedrückt Ansichtssache ob es in diesem Fall gemacht werden soll, bei Fenster-/Applikations-/Threadspezifischen Hooks auf jeden Fall */
/* Variante 1 bei PeekMessage einer Applikation mit Parameter PM_NOREMOVE */
if(code == HC_NOREMOVE) return 0; /* Zielfenster hat ein PeekMessage gemacht, das ganze darf zum Zielfenster durch => return 0 */
/* bzw. auch in diesem Fall - konsequenterweise - CallNextHookEx aufrufen, insofern ... Variante 2 statt Variante 1 verwenden=codieren=hinschreiben */
/* Variante 2 bei PeekMessage einer Applikation mit Parameter PM_NOREMOVE */
if(code == HC_NOREMOVE) return CallNextHookEx(MyKeybdHookHandleNr,code,wParam,lParam);
if(code != HC_ACTION) /* tu was, z.B. CallNextHookEx */ tu_was...();
/* Hier ist sicher, daß eine Nachricht aufgetreten ist und eine Aktion ausgeführt werden soll, deswegen auch HC_ACTION in der Parametervariable code */
GetCursorPos(&mauspos); /* wo steht's jetzt das Mauserl ? */
repeat_count= (lParam & 65535);
/* Virtual Keycodes abfragen: Mausposition verändern, sofern eine der richtigen Tasten (VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN) gedrückt wurde, eventuell andere Tasten bzw. eine Kombination aus "Pfeiltaste" + Shift oder anderem abfragen, da die Pfeiltasten nur mehr die Maus steuern, einen Texteditorcursor kann man mit den Pfeiltasten sonst nicht mehr positionieren, eventuell nur bei eingeschaltetem NUMLOCK usw. */
switch(wParam)
{
case VK_LEFT:
if(mauspos.x>=repeat_count) mauspos.x-=repeat_count; else mauspos.x=0;
break;
case VK_RIGHT:
if(mauspos.x+repeat_count<max_desktopx) mauspos.x+=repeat_count; else mauspos.x = max_desktopx - 1; /* max_desktopx muß man sich vom System besorgen, ebenso max_desktopy */
break;
case VK_UP:
if(mauspos.y>=repeat_count) mauspos.y-=repeat_count; else mauspos.y=0;
break;
case VK_DOWN:
if(mauspos.y+repeat_count<max_desktopy) mauspos.y+=repeat_count; else mauspos.y = max_desktop.y - 1;
break;
default: /* kein gesuchter Tastencode gekommen, zur nächsten Hookfunktion, so vorhanden */
return CallNextHookEx(MyKeybdHookHandleNr,code,wParam,lParam);
}
SetCursorPos(mauspos.x,mauspos.y); /* Mauszeiger positionieren */
return 1; /* Tastaturnachricht wurde bearbeitet */
}
MyKeybdHookHandleNr ist vom Typ HHOOK und muß eine globale Variable sein, max_desktopx und max_desktopy sind vom Typ int und ebenso globale Variablen, beschaffbar von Windows mittels dieser zwei Aufrufe: max_desktopx=GetSystemMetrics(SM_CXSCREEN); max_desktopy=GetSystemMetrics(SM_CYSCREEN); |
|
|
|
|
|
#28 |
|
Schwarzfußfrettchen
![]() Registriert seit: 28.01.2001
Beiträge: 2.071
|
Uiuiuiui... des wird jetzt aber kompliziert...
maus mit cursortasten bewegen.. ging doch in windoofs eh schon immer.. musst halt die EINGABEHILFEN installieren. Da is sowas praktischerweise gleich dabei ![]() wollt ich nur mal so am rand bemerkt haben...
____________________________________
Wann die kan Almdudler ham... \"Es gibt nur einen Weg zur Lunge, und der muss geteert werden, damit der Krebs nicht stolpert!\" http://www.dream.at/gizmo/bunny.gif Image is © 2001 Merle Sterndalsäg.. ähh... jäger
|
|
|
|
|
|
#29 |
|
Elite
![]() |
@kikakater
wow, danke, werd mich mal durchackern und verstehen probieren. großen dank. @sesa mina das weiß ich, hilft mir in meinem konkreten fall nicht weiter. trotzdem danke |
|
|
|
![]() |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
|
|