Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi SubMenüs in fremden Applikationen (https://www.delphipraxis.net/76865-submenues-fremden-applikationen.html)

nsamaster 11. Sep 2006 13:38


SubMenüs in fremden Applikationen
 
Hallo!

Ich habe vor einige Menüs in einer "Hauptanwendung" dynamisch zu erstellen, wobei dies durch entsprechende Plugins geschehen soll. Dafür ermittle ich das Handle der Applikation und danach das Handle des Menüs. Jetzt erstelle ich ein neues Menü mit Hilfe von "AppendMenu". Das klappt auch alles soweit ganz gut. Versuche ich nun aber auf diesem Wege ein PopUpMenu zu erstellen (Quasi ein Untermenü) dann passiert gar nix. Verwende ich nicht den richtigen Befehl oder wieso klappt das nicht?

R2D2 11. Sep 2006 14:45

Re: SubMenüs in fremden Applikationen
 
Poste doch mal den Source.

Olli 12. Sep 2006 11:05

Re: SubMenüs in fremden Applikationen
 
Ähem ... die Fragestellung macht mich nachdenklich. Daher habe ich zu meinem Vorredner noch eine Frage hinzuzufügen:

Meinst du wirklich eine "fremde Anwendung" im Sinne von "fremder Prozess", oder ist das Plugin normal als DLL implementiert und läuft damit auch innerhalb des Prozesses in dem das Menü erzeugt werden soll?

nsamaster 12. Sep 2006 17:41

Re: SubMenüs in fremden Applikationen
 
Hallo! Hier der Code.

Die erste Procedure erstellt ein Menü in einer anderen Anwendung, inklusive SubMenü.
Wenn ich den Code in eine Procedure übernehmen will, welche ein SubMenü anlegt geht da leider irgendetwas schief...
Ich weiß nicht was...

Die Aufrufe der Procedure sollte klar sein, HWND ist das Handle der Applikation, in welche das Menü rein soll.

@Olli:

Die Proceduren stecken in einer DLL, welche noch von anderen Programmen aufgerufen werden kann. Es sollte sich irgendwann um ein Plugin für eine bestimmte Applikation handeln, welche dann auch nur mit dieser funktioniert.

Delphi-Quellcode:

...
Type
  TChar128 = array[0..128] of Char;
...

// Diese Funktion erstellt auch nur ein Menü, allerdings habe ich hier
// zeigen wollen wie man in den einzelnen Menü's Untermenüs einfügt.
// An einer Prozedure für Untermenüs wird gearbeitet.
procedure nAddMenu(wnd: hwnd; MainMenuName: TChar128);
  var
    I: Integer;
    Menu, MyMenu, hMnu2: HMENU;
    Buffer: array [0..128] of Char;
    mii: TMenuItemInfo;
  begin
    Menu := GetMenu(Wnd); // Menü-Handle ermitteln
    zeroMemory(@Buffer, SizeOf(Buffer));
    if Menu <> 0 then
    begin
      I := 0;
      while I < GetMenuItemCount(Menu) do // wenn Menü vorhanden, dann weiter
      begin
        GetMenuString(Menu, I, Buffer, SizeOf(Buffer), MF_BYPOSITION);
        if Buffer = MainMenuName then    // Wenn eigener Menüeintrag vorhanden
          Break;                         // Abbruch!
        Inc(I);
      end;
      if I < GetMenuItemCount(Menu) then
        Exit;

      MyMenu := CreateMenu; // Hauptmenüpunkt erstellen

      AppendMenu(MyMenu, MF_STRING or MF_ENABLED, 40001, 'Test0&1'); // Menüeintrag
      AppendMenu(Menu, MF_STRING or MF_POPUP, UINT(MyMenu), MainMenuName); // Menüname

      hMnu2 := CreatePopupMenu(); // Untermenü erstellen
      AppendMenu(hMnu2, MF_STRING, 40002, 'Untermenü2'); // Untermenüeinträge

      // Das Untermenü erhält den Text "Weiter"
      // Hier wird die Bezeichnung des Untermenüs definiert.
      // Mit AppendMenu (s.o.) wird in hMnu2 die eigentlichen Items eingefügt
      mii.cbSize    := sizeof(TMenuItemInfo);
      mii.fMask     := MIIM_SUBMENU or MIIM_STRING or MIIM_ID;
      mii.wID       := 40003;
      mii.hSubMenu  := hMnu2;
      mii.dwTypeData := PAnsiChar('Untermenü');
      AppendMenu(MyMenu, MF_STRING or MF_BYPOSITION or MF_POPUP, hMnu2, 'Weiter');

      // zweites Untermenü
      hMnu2 := CreatePopupMenu;
      // diesmal mit zwei Einträgen
      AppendMenu(hMnu2, MF_STRING, 40005, 'TEST NUN ABER');
      AppendMenu(hMnu2, MF_STRING, 40006, 'Weiter');

      // Untermenü definieren.
      mii.cbSize := sizeof(TMenuItemInfo);
      mii.fMask := MIIM_SUBMENU or MIIM_STRING or MIIM_ID;
      mii.wID := 40004;
      mii.hSubMenu := MyMenu;
      mii.dwTypeData := PAnsiChar('test3');
      AppendMenu(MyMenu, MF_STRING or MF_BYPOSITION or MF_POPUP, hMnu2, 'Test 03');
    end;
  end;

procedure AddSubMenu(wnd: hwnd; InMainMenu: TChar128; MenuItem: TChar128; ID: Integer);
var
  I, J: Integer;
  MenuHnd, MyMenu, hMnu2: HMENU;
  Buffer: array [0..128] of Char;
  MenuInfo: TMenuItemInfo;
begin
  MenuHnd := GetMenu(wnd); // Menu-Handle ermitteln
  zeroMemory(@Buffer, SizeOf(Buffer)); // Buffer initialisieren
  if MenuHnd <> 0 then // Wenn Menu-Handle gefunden wurde dann weiter
  begin
    I := 0; // Zähler für MenuItems
    J := GetMenuItemCount(MenuHnd); // Items des Menu's "MenuHnd" ermitteln und in "J" speichern
    while I < J do // Solange der Zähler "I" kleiner ist als die Anzahl
                    // der Menüs dann weiter
    begin
      GetMenuString(MenuHnd, I, Buffer, SizeOf(Buffer), MF_BYPOSITION); // Menünamen ermitteln und in "Buffer" speichern
      If Buffer = MenuItem Then // InMainMenu gefunden...
      begin
        Break;
      end
      Else begin
        hMnu2 := CreatePopupMenu();
        AppendMenu(hMnu2, MF_STRING, 40002, 'Untermenü2'); // Untermenüeinträge

        MenuInfo.cbSize := SizeOf(TMenuItemInfo);
        MenuInfo.fMask := MIIM_SUBMENU or MIIM_STRING or MIIM_ID;
        MenuInfo.wID := ID;
        MenuInfo.hSubMenu := hMnu2;
        MenuInfo.dwTypeData := MenuItem;
        InsertMenuItem(MenuHnd, 1, FALSE, MenuInfo);
      end;
      inc(I);
    end;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 Uhr.

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