WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 28.01.2002, 16:37   #21
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

Zitat:
Original geschrieben von Who-T
1. verflixt
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 ist offline   Mit Zitat antworten
Alt 28.01.2002, 17:02   #22
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

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.
kikakater ist offline   Mit Zitat antworten
Alt 28.01.2002, 17:24   #23
Flink
Hero
 
Registriert seit: 29.08.2001
Alter: 58
Beiträge: 904


Flink eine Nachricht über ICQ schicken Flink eine Nachricht über Skype™ schicken
Standard

Zitat:
Original geschrieben von Who-T
1. verflixt
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.
____________________________________
Bibel
Flink ist offline   Mit Zitat antworten
Alt 28.01.2002, 19:42   #24
Who-T
Elite
 
Registriert seit: 01.08.2000
Beiträge: 1.395


Who-T eine Nachricht über ICQ schicken
Standard

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.
Who-T ist offline   Mit Zitat antworten
Alt 29.01.2002, 17:07   #25
Flink
Hero
 
Registriert seit: 29.08.2001
Alter: 58
Beiträge: 904


Flink eine Nachricht über ICQ schicken Flink eine Nachricht über Skype™ schicken
Pfeil 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.
____________________________________
Bibel
Flink ist offline   Mit Zitat antworten
Alt 30.01.2002, 01:33   #26
it00x30
Veteran
 
Registriert seit: 21.07.2001
Alter: 45
Beiträge: 404


Standard

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 ...)
it00x30 ist offline   Mit Zitat antworten
Alt 30.01.2002, 05:22   #27
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

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 */
*) 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);
kikakater ist offline   Mit Zitat antworten
Alt 30.01.2002, 07:17   #28
Sesa_Mina
Schwarzfußfrettchen
 
Registriert seit: 28.01.2001
Beiträge: 2.071


Standard

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
Sesa_Mina ist offline   Mit Zitat antworten
Alt 30.01.2002, 09:33   #29
Who-T
Elite
 
Registriert seit: 01.08.2000
Beiträge: 1.395


Who-T eine Nachricht über ICQ schicken
Standard

@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
Who-T ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


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


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