Hallo Sprint,
danke für deinen Code. Hat in meinen kurzen Tests super funktioniert. Ich hab trotzdem noch ein bisschen dran rumgespielt und folgendes drausgemacht:
Delphi-Quellcode:
function ScreenToAbsolute(const P: TPoint): TPoint;
begin
Result.X := P.X * (MAXWORD div GetSystemMetrics(SM_CXSCREEN));
Result.Y := P.Y * (MAXWORD div GetSystemMetrics(SM_CYSCREEN));
end;
procedure ClickMenuItem(hWnd: HWND; hMenu: HMENU; uItem: UINT);
var
R: TRect;
P: TPoint;
C: TPoint;
Inputs: array[0..2] of TInput;
begin
GetMenuItemRect(hWnd, hMenu, uItem, R);
P.X := (R.Left + R.Right) div 2;
P.Y := (R.Top + R.Bottom) div 2;
P := ScreenToAbsolute(P);
GetCursorPos(C);
try
FillChar(Inputs, SizeOf(Inputs), 0);
Inputs[0].Itype := INPUT_MOUSE;
Inputs[0].mi.dwFlags := MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE;
Inputs[0].mi.dx := P.X;
Inputs[0].mi.dy := P.Y;
Inputs[0].mi.dwExtraInfo := GetMessageExtraInfo;
Inputs[1].Itype := INPUT_MOUSE;
Inputs[1].mi.dwFlags := MOUSEEVENTF_LEFTDOWN;
Inputs[1].mi.dwExtraInfo := GetMessageExtraInfo;
Inputs[2].Itype := INPUT_MOUSE;
Inputs[2].mi.dwFlags := MOUSEEVENTF_LEFTUP;
Inputs[2].mi.dwExtraInfo := GetMessageExtraInfo;
SendInput(3, Inputs[0], SizeOf(Inputs[0]));
finally
SetCursorPos(C.X, C.Y);
end;
end;
Ich hab jetzt nur Bedenken, dass das mit dem simulierten Mausklick in der freien Wildbahn irgendwann mal nach hinten losgeht.
Ciao,
Uli.