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)

Who-T 27.01.2002 18:48

Mauscursor setzen
 
hi, eine frage:

ist es in java möglich, den bildschirmcursor, also das nette kleine pfeilchen, an bestimmte positionen zu setzen?

nach mehreren stunden google und javadoc durchforstung hab ich noch immer nix gefunden und mich würd jetzt interessieren ob das geht.

und wenn nicht, in welchen sprachen ist dies möglich?

RaistlinMajere 27.01.2002 20:40

public void setCursor(Cursor cursor) in java.awt.Component
schau mal bei go2java genau nach, wie das gehandled wird.

Who-T 27.01.2002 20:43

mit dem kann ich leider nur den cursortyp (hand, zeiger, sanduhr usw) setzen, nicht aber die position.

aus dem durchschauen des winVNC sources bin ich nicht wirklich schlau geworden, liegt auch daran, dass ich nicht wirklich viel ahnung von c++ hab (bissi mehr als nix um genau zu sein)

Flink 28.01.2002 12:44

mit setCaretPosition wird der Cursor für ein Eingabefeld gesetzt. In Java wird der eben Caret genannt. Wahrscheinlich, um Verwechslungen mit dem Datenbank-Cursor zu vermeiden.

kikakater 28.01.2002 13:02

Der Ausdruck "Caret" wird für den Textfeldcursor verwendet, sonst ist es der Pfeil oder die Sanduhr etc. Caret bedeutet Eingabemarke.

Mit <BOOL> SetCursorPos(int X,int Y) kann man den (Maus-)Cursor an die übergebene Bildschirmposition verschieben.

mfg Kikakater

Who-T 28.01.2002 13:05

danke, das genau würd ich brauchen
ich welcher klasse find ich das?

kikakater 28.01.2002 13:19

Ich habe den Microsoft Schinken nicht installiert, entweder suchst Du im www.google.com nach +mfc +setcursorpos oder Du wirfst VS/C++ an und benutzt die Hilfe. Sei nicht so faul ... alles hinterhertragen geht auch wieder nicht. :rolleyes:

P.S: Ich würde es mit ::SetCursorPos(x,y) versuchen.

Stona 28.01.2002 13:20

uiuiuiuiui.......

ich glaub net dass er JAVA im MS Visual Studio programiert, und das mit faul wird er a net auf sich sizten lassen!

kikakater 28.01.2002 13:25

Zitat:

Original geschrieben von Who-T
mit dem kann ich leider nur den cursortyp (hand, zeiger, sanduhr usw) setzen, nicht aber die position.

aus dem durchschauen des winVNC sources bin ich nicht wirklich schlau geworden, liegt auch daran, dass ich nicht wirklich viel ahnung von c++ hab (bissi mehr als nix um genau zu sein)

Also was jetzt Java oder C++ ? Doch MFC ? Wie auch immer, google schafft es sicher auch nach Java Klassen zu suchen.

Who-T 28.01.2002 13:26

ok, da bis jetzt die rede von java war und du etwas gach auf c++ umgestiegen bist (ohne das anzukündigen) war die verwirrung dementsprechend.

und dass ich von c++ noch nicht viel ahnung hab hab ich im ersten posting schon erwähnt.

weiters hab ich jetzt doch schon etliche stunden damit verbracht, eine möglichkeit im google zu suchen, so dass ich, meiner meinung nach zurecht, jetzt gerne einen hinweis hätte, mit dem ich was anfangen kann (sonst hätt ich nicht gepostet)

dass ich das ganze in c++ suchen muss, auch der funktionsname selber ist schon starke hilfe, danke.

jedoch bitte nicht immer gleich aufregen.:rolleyes:

kikakater 28.01.2002 13:30

Ist ja nur, weil Java so attraktiv nun auch wieder nicht ist. Langsam, absturzgefährdet usw. Java 2 ist da sicher schon eine Verbesserung.

kikakater 28.01.2002 13:56

setLocation(Point p) aus java.awt.Component scheint das Richtige zu sein.

Who-T 28.01.2002 14:07

nicht unbedingt, damit kann ich ein component verschieben, cursor hat als parent aber object

Flink 28.01.2002 14:09

Java oder C++
 
Zitat:

Original geschrieben von Who-T
ich welcher klasse find ich das?
1. Java oder C++ :confused:
2. in welchem Objekt willst du den Cursor setzen? Davon hängt schließlich ab, welche Klasse du verwenden mußt.

Who-T 28.01.2002 14:14

ok, zur aufklärung mal das vorhaben

ich möcht so ne art alternative maussteuerung machen, wie zb den cursor über die tasten zu bewegen.

ich hab grundlegende kenntnisse von C, etwas mehr von java und fast nichts von c++ (außer dass ich quellcode ungefähr verstehe, wenn er nicht zu hochtrabend wird)

das problem ist, dass ich derzeit nur die idee habe, und ich jetzt, bevor ich mich groß darauf stürze eine sprache suche, wie ich diesen cursor überhaupt bewegen kann.

kikakater 28.01.2002 14:22

Es ist alles gesagt im Moment, bis auf Java ... mußt halt die richtige Klasse instanzieren um mittels setLocation den Mauscursor zu positionieren.

Who-T 28.01.2002 14:32

mit setLocation kann ich leider nur ein Component, nicht aber einen Cursor bewegen.

sprich ich kann zwar das window irgendwohin verschieben, allerdings nicht den cursor

kikakater 28.01.2002 14:46

Verwende doch C ;) bei Java würde ich mich einmal näher informieren in einem Java Forum, ob man die Position und wenn dann wie setzen kann.

Flink 28.01.2002 15:07

Zitat:

Original geschrieben von Who-T
ich möcht so ne art alternative maussteuerung machen, wie zb den cursor über die tasten zu bewegen.

ich hab grundlegende kenntnisse von C, etwas mehr von java und fast nichts von c++ (außer dass ich quellcode ungefähr verstehe, wenn er nicht zu hochtrabend wird)

1. Willst Du es für alle Fenster in allen Programmen tun, müßtest du Hardware-nahe einen Tastaturtreiber in C programmieren :cool:
2. Verwende in Java einen Key-Listener
Dabei mußt du dann das Objekt ermitteln, auf welchem gerade der Mauszeiger liegt, anschließend die X-Y-Position intern hochzählen und bestimmen, an welches Objekt du den Mauszeiger weitergibst. Du mußt gar keinen Cursor setzen! Java arbeitet mit Mouse-Events und nimmt dir den komplizierten betriebssystem-abhängigen Teil der Maussteuerung ab!

Who-T 28.01.2002 15:21

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

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 17:26 Uhr.

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