WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Mauscursor setzen (http://www.wcm.at/forum/showthread.php?t=44398)

kikakater 28.01.2002 15:37

Zitat:

Original geschrieben von Who-T
1. verflixt :eek:
das wird hart.
über ein im hintergrund laufendes programm würde es nicht funktionieren?

2. ich hab es gestern mit MouseEvent.translatePoint versucht, das bewegt zwar vielleicht intern den point, allerdings tut sich beim bildschirmcursor nix

translatePoint verändert die Koordinaten des aufgetretenen Events und nicht den Bildschirmmauscursor.

kikakater 28.01.2002 16:02

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.

Flink 28.01.2002 16:24

Zitat:

Original geschrieben von Who-T
1. verflixt :eek:
das wird hart.
über ein im hintergrund laufendes programm würde es nicht funktionieren?

2. ich hab es gestern mit MouseEvent.translatePoint versucht, das bewegt zwar vielleicht intern den point, allerdings tut sich beim bildschirmcursor nix

1. Treiber = ein im Hintergrund laufendes Programm, das auf die Hardware (Interrupts) zugreift. Unter MSDOS gab es noch die TSR-Programme, die im Hintergrund abliefen. Jeher höher die Windows-Versionen voranschreiten, desto weniger erlaubt Microsoft, um auf Nummer sicher zu gehen.
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.

Who-T 28.01.2002 18:42

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.

Flink 29.01.2002 16:07

vielleicht
 
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.:o

it00x30 30.01.2002 00:33

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 ...)

kikakater 30.01.2002 04:22

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 :p ? 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 */

*) Hookfunktion implementieren, schreiben, kreieren, was auch immer
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);

Sesa_Mina 30.01.2002 06:17

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...

Who-T 30.01.2002 08:33

@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


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag