Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Menüpunkte eines fremden Programms (https://www.delphipraxis.net/19083-menuepunkte-eines-fremden-programms.html)

Cuchulainn 29. Mär 2004 08:30


Menüpunkte eines fremden Programms
 
Guten Morgen.

Mit folgendem Quelltext möchte ich gerne die Menüpunkte des Hauptmenüs eines fremden Programms in einer Listbox anzeigen.

Delphi-Quellcode:
procedure TFrmMenues.FormCreate(Sender: TObject);
var hBiss: HWND;
    hMenue: HMENU;
    IntZaehler: Integer;
    StrText: String;
begin
  hBiss := FindWindow(nil, 'Biss+');
  hMenue := GetMenu(hBiss);
  SetLength(StrText, 255);
  for IntZaehler := 0 to GetMenuItemCount(hMenue) - 1 do
  begin
    GetMenuString(hMenue, IntZaehler, pchar(StrText), SizeOf(StrText), MF_BYPOSITION);
    ListBoxHaupt.Items.Add(StrText);
  end;
end;
Allerdings werden mir immer nur die die ersten drei Zeichen angezeigt. Weiß jemand, wo der Fehler liegt?

shmia 29. Mär 2004 10:48

Re: Menüpunkte eines fremden Programms
 
Versuch mal (ungetestet):

Delphi-Quellcode:
procedure TFrmMenues.FormCreate(Sender: TObject);
var hBiss: HWND;
    hMenue: HMENU;
    IntZaehler, len: Integer;
    StrText: String;
begin
  hBiss := FindWindow(nil, 'Biss+');
  hMenue := GetMenu(hBiss);
  for IntZaehler := 0 to GetMenuItemCount(hMenue) - 1 do
  begin
    // benötigte Länge abfragen
    len := GetMenuString(hMenue, IntZaehler, nil, 0, MF_BYPOSITION);
    // Speicher bereitstellen
    SetLength(StrText, len+1); // +1 für terminating null character

    if GetMenuString(hMenue, IntZaehler, pchar(StrText), len+1, MF_BYPOSITION) <> 0 then
       ListBoxHaupt.Items.Add(Copy(StrText,1, len))
    else
       ListBoxHaupt.Items.Add(Format('GetMenuString(,%d,,) failed', [IntZaehler])
  end;
end;
Ausserdem würde ich daraus eine Procedure machen:
procedure FillTStringsFromMenuHandle(hMenue: HMENU; list:TStrings);
und in irgeneine Unit mit weiteren Hilfsfunktionen packen.

Cuchulainn 29. Mär 2004 10:55

Re: Menüpunkte eines fremden Programms
 
Vielen Dank. Es hat funktioniert.

Zitat:

Zitat von shmia
Ausserdem würde ich daraus eine Procedure machen:
procedure FillTStringsFromMenuHandle(hMenue: HMENU; list:TStrings);
und in irgeneine Unit mit weiteren Hilfsfunktionen packen.

Das ist eine gute Idee. Aber zuerst wollte ich einmal sicher sein, dass es überhaupt funktioniert :)

Larsi 7. Okt 2008 13:22

Re: Menüpunkte eines fremden Programms
 
Auch wenns schon ziemlich alt ist. Wie muss ich die Procedur umbauen sodass die Items ohne Listbox mit Subitems in ein Mainmenü auf meiner Form kopiert werden?

DeddyH 7. Okt 2008 13:25

Re: Menüpunkte eines fremden Programms
 
Zitat:

...sodass die Items ohne Listbox mit Subitems in ein Mainmenü auf meiner Form...
:wiejetzt:

Larsi 7. Okt 2008 13:26

Re: Menüpunkte eines fremden Programms
 
Zitat:

Zitat von DeddyH
Zitat:

...sodass die Items ohne Listbox mit Subitems in ein Mainmenü auf meiner Form...
:wiejetzt:

:wiejetzt:

Also die Items aus dem fremden Menü sollen sammt Subitems in ein Mainmenü auf meiner Form kopiert werden.

DeddyH 7. Okt 2008 13:32

Re: Menüpunkte eines fremden Programms
 
Schau Dir mal MSDN-Library durchsuchenInsertMenuItem an.

Larsi 7. Okt 2008 13:38

Re: Menüpunkte eines fremden Programms
 
Und wass muss ich der Funktion in diesem Beipsiel für Parameter übergeben?

MSDN sagt folgendes:
Zitat:

BOOL InsertMenuItem(
HMENU hMenu,
UINT uItem,
BOOL fByPosition,
LPCMENUITEMINFO lpmii
);
Aber was muss da in meinen Fall rein?

Edit: Sicher, dass InserMenuItem richtig ist? Das erstellt ja in der fremden Anwendung MEnüeinträge oder kann man das auch anders nutzen?

DeddyH 7. Okt 2008 14:02

Re: Menüpunkte eines fremden Programms
 
Es steht doch da:
Zitat:

Parameters

hMenu
[in] Handle to the menu in which the new menu item is inserted.
uItem
[in] Identifier or position of the menu item before which to insert the new item. The meaning of this parameter depends on the value of fByPosition.
fByPosition
[in] Value specifying the meaning of uItem. If this parameter is FALSE, uItem is a menu item identifier. Otherwise, it is a menu item position.
lpmii
[in] Pointer to a MENUITEMINFO structure that contains information about the new menu item.
hMenu wäre also in Deinem Fall das Handle des Menüs, in das eingefügt werden soll. Ob das auf Deinem Formular oder woanders liegt, ist doch erstmal egal, oder?

Larsi 7. Okt 2008 14:34

Re: Menüpunkte eines fremden Programms
 
Muss das wirklich alle so kompliziert sein? Kann man nicht einfach das Mainmenü in mein Programm kopieren?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:22 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz