C++ Mouse Position Problem

01/26/2013 22:03 Dromerace#1
Hey Leute, ich bräuchte mal wieder eure Hilfe...
ich hab nen Code, der erkennt wo die maus ist, und den x&y wert ausgibt.
klappt auch ganz gut.
wollte jetzt so umschreiben, dass er wenn er an einer bestimmten Position steht und linksklick macht, eine Funktion ausführt. Leider (egal wo ich klicke) führt er nur die Erste Funktion aus... =(

Das Programm funktioniert ansonsten einwandfrei, alles nach plan, bis auf wenn ich mit der Maus agiere, immer nur die erste fkt ausgeführt wird.
Hab sogar probiert, ir.Event.MouseEvent.dwMousePosition.X == 32 zu schreiben, anstatt einem =

PS: ist ne konsolenanwendung und mit microsoft c++ 2010 express erstellt

Danke schonmal :D

Edit: Achja, ich hab natürlich alles includiert ;)
es ist nix rot unterstrichen
steht im code oben aber nicht dran
01/26/2013 22:38 snow#2
Welche erste Funktion meinst du?

Ansonsten:

if((ir.Event.MouseEvent.dwMousePosition.X = 32) & (ir.Event.MouseEvent.dwMousePosition.Y = 280) usw)

-> Vergleiche müssen mit == gemacht werden, das und, das du meinst, macht man mit &&, so ist das ein logischer AND-Operator & den brauchst du da nicht. :)
01/26/2013 22:47 Dromerace#3
Code:
if((ir.Event.MouseEvent.dwMousePosition.X = 32) & (ir.Event.MouseEvent.dwMousePosition.Y = 280) & ir.Event.MouseEvent.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED)
				{
					system("cls");
					cout << "Unendlich versuche wurden gewaehlt" << endl;		
				max_versuche = 1000;
					ZahlenRaten();
die funktion meine ich, habs grade so gemacht wie du gesagt hast, jz ewrkennt er die maus aber nichtmehr und führt garnichts aus -.-
also so stehts jetz bei mir da :
Code:
if((ir.Event.MouseEvent.dwMousePosition.X = 32) & (ir.Event.MouseEvent.dwMousePosition.Y = 280) & (ir.Event.MouseEvent.dwButtonState) & (FROM_LEFT_1ST_BUTTON_PRESSED))
01/26/2013 22:56 Nightblizard#4
Versuch && und nicht &. && ist ein logisches und, & ist ein binäres und.
01/26/2013 22:58 Dromerace#5
ich hab schon alles probiert, sogar == und ||(ist falsch, ich weiß) auch hab ich mal kleine klammern mal mehr etc.
Daran liegts sicher nicht
Aber trzdm danke

immo siehts so aus:
01/26/2013 23:03 snow#6
if((ir.Event.MouseEvent.dwMousePosition.X == 32) && (ir.Event.MouseEvent.dwMousePosition.Y == 280) && (ir.Event.MouseEvent.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED))

^so probiert?

Das Problem: Wenn die Bedingung der if-Schleife erfüllt ist, springt das Programm da rein und führt die Funktion aus. Bisher wurde die Bedingung wohl immer erfüllt. Mit dem Code am Anfang meines Posts sollte es nur gehen, falls x ==32, y == 280 && die Maustaste gedrückt ist / wird.
01/26/2013 23:10 Dromerace#7
erkennt jetzt die maus nicht bzw. reagiert nicht drauf
01/26/2013 23:59 Nightblizard#8
Selbstverständlich liegt das (auch) am &&! & macht etwas ganz anderes...
01/27/2013 02:20 MrSm!th#9
Quote:
Originally Posted by snow911 View Post
Das Problem: Wenn die Bedingung der if-Schleife erfüllt ist
[Only registered and activated users can see links. Click Here To Register...]

Quote:
Selbstverständlich liegt das (auch) am &&! & macht etwas ganz anderes...
Ist zwar theoretisch richtig, praktisch ergibt es aber (fast) dasselbe.
Wenn ich die Ergebnisse von boolschen Ausdrücken binär &-verknüpfe, kommt halt ne binäre Zahl raus, die dieselbe Wahrheitstabelle wie das logische && hat und wird dann als Abfragewert für das if verwendet ;O
Der Unterschied liegt allerdings natürlich darin, dass & kein short-circuit-Operator ist.

Problematischer ist da wohl das einfache =. Für Vergleiche wird == verwendet!
01/27/2013 02:24 nkkk#10
Quote:
Originally Posted by Dromerace View Post
erkennt jetzt die maus nicht bzw. reagiert nicht drauf
evtl liegt es einfach daran das du mti der maus einfach nicht die koordinaten (32,280) triffst?
du könntest am ende ein
Code:
else
{
std::cout << "Position: X=" << ir.Event.MouseEvent.dwMousePosition.X<< " Y=" << ir.Event.MouseEvent.dwMousePosition.Y << std::endl;
}
einfügen um zu überprüfen ob die mausposition richtig war.

Quote:
Originally Posted by Nightblizard View Post
Selbstverständlich liegt das (auch) am &&! & macht etwas ganz anderes...
in dem beispiel von snow911 sehe ich keine fehler.
01/27/2013 02:57 snow#11
Quote:
Originally Posted by MrSm!th View Post
[Only registered and activated users can see links. Click Here To Register...]
Werde ich Mittwoch meinem Dozenten um die Ohren hauen. :p
Aber okay, der erklärt auch, dass nach dem Call die Parameter gepusht werden..

@nkkk: Ich glaube, Nightblizard meinte auch Dromeraces Code.

Aber das mit dem std::cout der Koordinaten ist eine gute Idee, das ist sicher nen Versuch wert.
01/27/2013 03:12 MrSm!th#12
Quote:
Werde ich Mittwoch meinem Dozenten um die Ohren hauen.
Exmatrikulieren!
01/27/2013 13:09 Dromerace#13
Ich hab jetzt den Fehler gefunden, weis aber irgendiwe nur nicht, durch was er hervorgerufen wird oder wie ich ihn beheben kann.
Hab ich jetzt eingefügt:
Code:
else if((ir.Event.MouseEvent.dwMousePosition.X = 3) && (ir.Event.MouseEvent.dwMousePosition.Y = 280))
				{
				cout << "Position: X=" << ir.Event.MouseEvent.dwMousePosition.X << " Y=" << ir.Event.MouseEvent.dwMousePosition.Y<< endl;
				}
und EGAL! wo die maus ist, es wird ausgegeben: x=3 und y=280, da es wahrscheinlich kein änderbarer wert ist, kann ich das iwie ändern?
01/27/2013 13:13 .SkyneT.#14
Also ich bin mir ziemlich sicher das du nicht nur auf einen einzigen Pixel am
Bildschirm klicken willst...

Du wirst erst einen "Bereich" aussuchen müssen wohin
du klicken willst.

Dafür würde sich eine kleine Struktur eignen:
Code:
struct _rectangle
{
   int x;
   int y;
   int rx;
   int ry;
};
(oder RECT aus windows.h)

Die position der Maus würde ich mit GetCursorPos() bestimmen.
Zu verwenden ist das so:
Code:
#include <windows.h>
//.....
POINT pCursorPos;
GetCursorPos(&pCursorPos);
Danach solltest du dir eine Funktion schreiben, so in
etwa würde ich den Prototyp wählen:
Code:
bool isPointInRect (_rectangle Area, POINT Point);
Letztendlich kannst du mit dem ganzen Zeug dann
bestimmen ob dein geklickter Punkt in einem
bestimmten Bereich liegt, und je nach dem eine
Funktion ausführen.
Code:
if (GetAsyncKeyState(VK_LBUTTON) && isPointInRect(Area, Point))
{
    //DoStuff
}
01/27/2013 14:07 +Yazzn#15
Quote:
Originally Posted by Dromerace View Post
Code:
else if((ir.Event.MouseEvent.dwMousePosition.X = 3) && (ir.Event.MouseEvent.dwMousePosition.Y = 280))
				{
				cout << "Position: X=" << ir.Event.MouseEvent.dwMousePosition.X << " Y=" << ir.Event.MouseEvent.dwMousePosition.Y<< endl;
				}
und EGAL! wo die maus ist, es wird ausgegeben: x=3 und y=280, da es wahrscheinlich kein änderbarer wert ist, kann ich das iwie ändern?
Dazu ist nicht viel mehr zu sagen als
Quote:
Originally Posted by MrSm!th View Post
Problematischer ist da wohl das einfache =. Für Vergleiche wird == verwendet!