![]() |
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? |
Re: SubMenüs in fremden Applikationen
Poste doch mal den Source.
|
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? |
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