Hallo,
ich weiß, daß das ganze Forum mit dem Thema voll ist und ich hab auch schon viele Threads gelesen und ausprobiert, angefangen mit sendmessage über mouse_event bis jetzt zuletzt bei SendInput. Ich habe die
OH gelesen und auch gegoogelt. Ich weiß von der Cursor- und Mauspositions-Differenz und deren Umrechnung.
Das Zeiger-Positionieren klappt auch. Aber das Klicken ums Verrecken nicht
Es geht eigentlich nur darum, ein FoxPro-Formular ganz fix mit immer ähnlichen Informationen zu füllen.
Also dachte ich mir, lässte das anklicken, füllst die Buchstaben rein und gut ist.
Keybd_event funktioniert prima und die Felder werden schön gefüllt.
Aber das Anklicken von Buttons funktioniert so absolut überhaupt nicht
Wenn die wenigstens ein
Handle hätten, dann wär ich schon fertig, aber die Eingabefelder des Foxpro-Forumlars haben keine Handles, und die Buttons auch nicht.
Also positioniere ich den Mauszeiger (setCursorPos) und versuche einen Klick darauf. Aber es geht nicht.
Ich habe eine Testapp mit Delphi gemacht, die ich ansteuere. Tastatur funktioniert, Mausklicks nicht - liegt also nicht am FoxPro-Formular, sondern an meiner Programmierung.
Ich habe auch die Beispiele hier aus dem Forum kopiert - klappen auch nicht! Daher bin ich völlig ratlos.
Dies ist mein Stand der Dinge, es funzt nix (bei mir und meiner Windows Vista-Umgebung):
Code:
procedure MClick1(xpos,ypos:integer);
var Inp:TInput;
begin
Inp.Itype := INPUT_MOUSE;
Inp.mi.dwFlags := MOUSEEVENTF_LEFTDOWN or MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE;
Inp.mi.dx := round(xPos * (65535 / Screen.Width));
Inp.mi.dy := round(yPos * (65535 / Screen.Height));
Inp.mi.time := 0;
Inp.mi.dwExtraInfo := 0;
SendInput(1, Inp, SizeOf(Inp));
Inp.Itype := INPUT_MOUSE;
Inp.mi.dwFlags := MOUSEEVENTF_LEFTUP or MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE;
Inp.mi.dx := round(xPos * (65535 / Screen.Width));
Inp.mi.dy := round(yPos * (65535 / Screen.Height));
Inp.mi.time := 0;
Inp.mi.dwExtraInfo := 0;
SendInput(1, Inp, SizeOf(Inp));
end;
Ich mache auch das Zielfenster aktiv.
Code:
if MessageDlg('Zeige auf das erste Eingabefenster und drücke OK'#13+
'Aber natürlich nicht mit der Maus!!',
mtinformation,[mbOK,mbCancel],0)=idOK then
begin
GetCursorPos(CursorPos);
W := WindowFromPoint(CursorPos);
postmessage(w,wm_setfocus,0,0);
SetForegroundWindow(w);
SendMessage(w, WM_CHILDACTIVATE, 0, 0);
...
//x und y werden korrekt aus einem Script ermittelt und übergeben
MKlick1(x,y);
..und da schaltet das andere Fenster auf Aktiv um. Aber die Klicks werden trotzdem nicht ausgelöst.
Ein anderer Versuch, der aber schon etwas verkorkst aussieht durch meine Fehlversuche:
Code:
procedure MClick(c:char; x,y:integer);
var i:byte; m:integer; p:TPoint; w:hwnd;
begin
GetCursorPos(p);
if (x<0) then x:=p.X;
if (y<0) then y:=p.Y;
m:=0;
{ if cbm.Checked then m:=m or MOUSEEVENTF_MOVE;
if cb1.Checked then m:=m or MOUSEEVENTF_ABSOLUTE;
// noch umrechnen
if not cb2.Checked then begin
x := 65535 Div Screen.DesktopWidth*x;
y := 65535 Div Screen.DesktopHeight*y;
end else begin
if not cb2b.Checked then SetCursorPos(x,y)
else begin
x:=0; y:=0;
end;
end;
}
GetCursorPos(p);
W := WindowFromPoint(p);
postmessage(w,wm_setfocus,0,0);
SetForegroundWindow(w);
SendMessage(w, WM_CHILDACTIVATE, 0, 0);
setcursorPos(x,y);
//x:=0;
//y:=0;
x := 65535 Div Screen.DesktopWidth*x;
y := 65535 Div Screen.DesktopHeight*y;
// von x,y habe ich im Forum gesehen, daß ein paar diese Werte übergeben, andere diese auf Null lassen
// beides hat nichts am Klickverhalten verändert.
case c of
'L': mouse_event(MouseEventF_LeftDown or m,x,y,0,0);
'R': mouse_event(MouseEventF_RightDown or m,x,y,0,0);
'M': mouse_event(MouseEventF_MiddleDown or m,x,y,0,0);
end;
//application.processmessages;
sleep(500);
case c of
'L': mouse_event(MouseEventF_LeftUp or m,x,y,0,0);
'R': mouse_event(MouseEventF_RightUp or m,x,y,0,0);
'M': mouse_event(MouseEventF_MiddleUp or m,x,y,0,0);
end;
end;
end;
JE mehr es nicht funktioniert und dran rumbastelt, schleichen sich natürlich auch blöde Fehler ein.
Ich finde keine.
Kann mir jemand bitte helfen, Mausklicks auf dem anderen Programm auszulösen?