Entwickler-Ecke

Windows API - Fremde Menüs ansprechen...


Matrikz - Do 12.09.02 07:45
Titel: Fremde Menüs ansprechen...
Hallo...

habe ein Problem. Und zwar will ich das Menü eines anderen Programms ansprechen. Ist das irgendwie möglich?
Habe mit die diesem ganzen FindWindow-Kram leider noch nicht so richtig Erfolg gehabt.

Ich danke schonmal für eure Antworten! :)

Ciao Thomas


Delete - Do 12.09.02 08:27

Hol dir mit GetMenu ein Handle auf das Menü. Dann kannst du damit machen was du willst.
Zum Beispiel mit GetSubMenu ein Handle auf eine Eintrag holen.

Beispiel: Aus lesen des ersten Menüeintrages vom Editor.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.Button1Click(Sender: TObject);
var
 hWindow, hMenu, hSubmenu: Cardinal;
 buffer: array[0..255] of Char;
begin
  ZeroMemory(@buffer, sizeof(buffer));
  hWindow := FindWindow(nil, 'Unbenannt - Editor');
  if hWindow <> 0 then
  begin
    hMenu := GetMenu(hWindow);
    if hMenu <> 0 then
    begin
      GetMenuString(hMenu, 0, buffer, sizeof(buffer), MF_BYPOSITION);
      label1.Caption := buffer;
    end;
  end;
end;


Matrikz - Do 12.09.02 09:08

Danke erstmal...

Leider finde ich nicht das was ich will. Es wäre cool wenn ich mir alle Fenster auflisten lassen könnte.
Ich hatte auch schon mal einen entsprechenden Quellcode aber leider finde ich den nicht mehr...

Hat noch jemand was in Petto? wäre cool!

Ach ja... Gibt es eine Möglichkeit rauszufinden wie viele Einträge ein Menu hat?

Mit ner while Schleife klappt das nicht, weil GetMenuString auch bei einem Trennstrich 0 zurück gibt.

Danke nochmals!


Delete - Do 12.09.02 09:16

Alle sichtbaren Fenster in eine Listbox:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
type
PMyEnumParam = ^TMyEnumParam;
TMyEnumParam = record
  lb: TListbox;
end;

function GetWindows(const hWnd : Longword;
                          Param: PMyEnumParam): LongBool; stdcall;
var
  Len : Longint;
  S   : String;
begin
  Result := True;
  if not ( IsWindow(hWnd) and IsWindowVisible(hWnd) ) then Exit;
  Len := SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0);
  if Len > 0 then
  begin
    SetLength(S, Len);
    SendMessage(hWnd, WM_GETTEXT, Len + 1, Longint(Pchar(S)));
    Param.lb.Items.Add(s);
  end;
  // mit Result = False kann die Callbackfunktion vorzeitig verlassen werden
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Param: TMyEnumParam;
begin
  Param.lb := Listbox1;
  EnumWindows(@GetWindows, LPARAM(@Param));
end;