AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi SubMenüs in fremden Applikationen
Thema durchsuchen
Ansicht
Themen-Optionen

SubMenüs in fremden Applikationen

Ein Thema von nsamaster · begonnen am 11. Sep 2006 · letzter Beitrag vom 12. Sep 2006
Antwort Antwort
nsamaster

Registriert seit: 12. Jun 2002
Ort: BRD umd die ecke links und dann immer gerade aus
31 Beiträge
 
#1

SubMenüs in fremden Applikationen

  Alt 11. Sep 2006, 13:38
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?
  Mit Zitat antworten Zitat
Benutzerbild von R2D2
R2D2

Registriert seit: 20. Jan 2006
Ort: München
253 Beiträge
 
Delphi 2005 Personal
 
#2

Re: SubMenüs in fremden Applikationen

  Alt 11. Sep 2006, 14:45
Poste doch mal den Source.
if then then then = else else else = then;

Meine Webseite
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#3

Re: SubMenüs in fremden Applikationen

  Alt 12. Sep 2006, 11:05
Ä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?
  Mit Zitat antworten Zitat
nsamaster

Registriert seit: 12. Jun 2002
Ort: BRD umd die ecke links und dann immer gerade aus
31 Beiträge
 
#4

Re: SubMenüs in fremden Applikationen

  Alt 12. Sep 2006, 17:41
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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:16 Uhr.
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