Maus-Koordinaten ausserhalb des Programmfensters ?

buli

Grünschnabel
Hallo zusammen,

ich bin verzweifelt, den ich suche eine Möglichkeit die Mauskoordinaten ausserhalb meiner Dialogfeldbasierenden Anwendung zu ermitteln und per Mausklick zu speichern.

Mein 1. Versuch:

Code:
#include <windows.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

int main()
{
  POINT mPos;

  while(1)
  {
    GetCursorPos(&mPos);
    cout << "X:" << mPos.x << "  Y:" << mPos.y << endl;

    system("CLS");
  }
  return 0;
}

funktioniert zwar, jedoch aber nur als Konsolenprogramm. Da ich aber eine Dialogfeldbasierende Anwendung machen will, habe ich das Versucht:

Code:
void CMouseDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen
	

	POINT mPos;
	GetCursorPos(&mPos);
	
		m_posX = mPos.x;
		m_posY = mPos.y;

	UpdateData(FALSE);

	
	CDialog::OnMouseMove(nFlags, point);
}

Das klappt auch, jedoch nur INNERHALB des Dialogfensters. Verlasse ich meine Anwendung, werden mir die Koordinaten nichtmehr angezeigt. Und auch der Mausklick kann nicht gefangen werden, da er auf eine andere Anwendung erfolgt.

Das eigentliche Ziel ist ein Mauspointer, mit dem ich eine Koordinate bestimme und speichere. Nach ablauf eines Timers soll dann ein Klick auf diese Koordinate (z.B. zum automatisches Auffrischen des Browsers).erfolgen. Kann mir bitte jemand weiterhelfen ?

Danke im Voraus.
 
Das machst du am besten mit einem Timer. OnMouseMove bekommst du nur aufgerufen, wenn sich die Maus innerhalb deines Fensters befindet. Du könntest auch auf SetCapture zurückgreifen. Dann bekommst du auch die Mausposition ausserhalb. Solange, bis du ReleaseCapture aufrufst oder eine Maustaste drückst.
 
Du könntest das Ganze auch mit einem Maus-Hook machen, siehe hier in den Tutorials, da ist von mir eines, dass Windows-Hooks behandelt.

Daniel
 
Daniel Toplak hat gesagt.:
Du könntest das Ganze auch mit einem Maus-Hook machen, siehe hier in den Tutorials, da ist von mir eines, dass Windows-Hooks behandelt.

Daniel

Das ist eindeutig die bessere Variante als eine Schleife oder einen Timer, auch wenn es villeicht ein bischen viel Aufwand bereitet. Da bekommst nur dann eine Nachricht wenn die Maus wirklich bewegt wird.

Wenn du sowas wie Browser refresh machen willst kannst du dir auch ein Handle auf das Fenster besorgen (da hilft Spy++) und das dann mit Nachrichten ,,bewerfen''.

Gruß
 
Endurion hat gesagt.:
Das machst du am besten mit einem Timer. OnMouseMove bekommst du nur aufgerufen, wenn sich die Maus innerhalb deines Fensters befindet. Du könntest auch auf SetCapture zurückgreifen. Dann bekommst du auch die Mausposition ausserhalb. Solange, bis du ReleaseCapture aufrufst oder eine Maustaste drückst.

Ok, das mit SetCapture hört sich gut an, jedoch finde ich mich mit der Funktion nicht zurecht. In MSDN ist auch nich so gut beschrieben.(Bin Anfänger in C++). Wo muss ich denn SetCapture aufrufen, und wie kann ich mir dann das Ergebnis anzeigen lassen bzw. in einer Variablen anzeigen lassen? Hast Du mir evtl. einen kleinen Beispielcode Wäre super. Danke im Voraus.
 
Du rufst SetCapture irgendwo auf, wo es vom Ablauf her passt. Wenn du im Dialog immer die Maus haben willst, kannst du SetCapture in OnInitDialog (bzw. WM_INITDIALOG) aufrufen. Dann bekommst du solange WM_MOUSEMOVE bis der User ausserhalb klickt.

Wenn der User dann deinen Dialog wieder nach vorne holt (WM_ACTIVATE), dann kannst du SetCapture erneut aufrufen.

OnInitDialog()
..
SetCapture();
...

OnMouseMove()
...
Mauskoordinaten abfragen
...

OnActivate()
...
if ( nState != WA_INACTIVE )
{
SetCapture();
}
...


Weiss jetzt nicht genau, ob das schon so einfach klappt, evtl. müssen noch ein paar Sonderfälle berücksichtigt werden.
 
Zurück