Einzelnen Beitrag anzeigen

Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#8

Re: TMenuItem per Code aufklappen?

  Alt 28. Aug 2009, 09:19
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.
Uli Gerhardt
  Mit Zitat antworten Zitat