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 Fremdes PopupMenu erweitern (https://www.delphipraxis.net/153303-fremdes-popupmenu-erweitern.html)

Björn Ole 28. Jul 2010 15:39

Fremdes PopupMenu erweitern
 
Hallo,


ist es möglich, ein Popupmenu (des Tray-Icons) einer fremden,
nicht-Delphi Anwendung (32bit) um einen Eintrag zu erweitern?

Ich habe schon versucht, Informationen zu sammeln, aber finde nichts passendes,
nocht nicht mal irgendwelche Nachrichten, die ich hooken könnte.
Darum befürchte ich, dass es überhaupt nicht möglich ist... :(

Wäre für einen Ratschlag dankbar.


Gruß, Björn

mkinzler 28. Jul 2010 15:43

AW: Fremdes PopupMenu erweitern
 
Was hast du vor?

Björn Ole 28. Jul 2010 15:52

AW: Fremdes PopupMenu erweitern
 
Ich habe für eine Anwendung eine Art Zusatzfeature programmiert und möchte jetzt einen kleinen "Einstellungen"-Dialog über das Popupmenu öffnen. Zur Not könnte ich mein Zusatzfeature auch in eine weitere Anwendung auslagern und es darüber machen, aber mich würde es halt interessieren, ob es nicht auch über das Popupmenu geht, weil das komfortabler zu bedienen wäre.

mkinzler 28. Jul 2010 15:54

AW: Fremdes PopupMenu erweitern
 
Also ich persönlich fände es nicht gut, wenn jemand ein Kontextmenü meiner Anwendung erweitert.

Björn Ole 28. Jul 2010 15:57

AW: Fremdes PopupMenu erweitern
 
Hättest du einen besseren Vorschlag?

Ich würde die TNA ungern mit einem weiteren Icon belästigen wollen, und da schien mir die Idee mit dem Erweitern des Popupmenus am dezentesten.


[Edit]
Habe es inzwischen selber hinbekommen.
  • WH_CALLWNDPROC mittels SetWindowsHookEx hooken
  • auf WM_INITMENU warten
  • InsertMenuItem mit dem Handle des PopupMenus (CWPSTRUCT.wParam) aufrufen

Für weitere Ratschläge bin ich aber weiterhin offen. :wink:

Schwedenbitter 4. Jul 2011 14:24

AW: Fremdes PopupMenu erweitern
 
Zitat:

Zitat von Björn Ole (Beitrag 1038164)
[Edit]
Habe es inzwischen selber hinbekommen.
  • WH_CALLWNDPROC mittels SetWindowsHookEx hooken
  • auf WM_INITMENU warten
  • InsertMenuItem mit dem Handle des PopupMenus (CWPSTRUCT.wParam) aufrufen

Würde es Dir viel ausmachen, hier mal Code zu posten?

Ich stehe vor einem ähnlichen Problem. Ich möchte gern das PopupMenü eines stinknormales TMemo um einen Eintrag erweitern.
Mit
Delphi-Quellcode:
lMenu:=GetSystemMenu(Memo1.Handle, False);
InsertMenu(lMenu, 0, MF_BYPOSITION, PrevItemID, 'Icons preview');
klappt es leider nicht. Ist ja auch kein SystemMenü. Aber
Delphi-Quellcode:
GetMemo
bringt mich auch nicht weiter ...

EWeiss 4. Jul 2011 16:03

AW: Fremdes PopupMenu erweitern
 
Zitat:

Zitat von Schwedenbitter (Beitrag 1109907)
Zitat:

Zitat von Björn Ole (Beitrag 1038164)
[Edit]
Habe es inzwischen selber hinbekommen.
  • WH_CALLWNDPROC mittels SetWindowsHookEx hooken
  • auf WM_INITMENU warten
  • InsertMenuItem mit dem Handle des PopupMenus (CWPSTRUCT.wParam) aufrufen

Würde es Dir viel ausmachen, hier mal Code zu posten?

Ich stehe vor einem ähnlichen Problem. Ich möchte gern das PopupMenü eines stinknormales TMemo um einen Eintrag erweitern.
Mit
Delphi-Quellcode:
lMenu:=GetSystemMenu(Memo1.Handle, False);
InsertMenu(lMenu, 0, MF_BYPOSITION, PrevItemID, 'Icons preview');
klappt es leider nicht. Ist ja auch kein SystemMenü. Aber
Delphi-Quellcode:
GetMemo
bringt mich auch nicht weiter ...

na ja mal ne dumme frage warum verwendest du dann nicht GetMenu(dein handle) ?
dann über GetMenuItemCount(ermitteltes handle) die einträge auslesen


gruss

Schwedenbitter 4. Jul 2011 16:18

AW: Fremdes PopupMenu erweitern
 
Zitat:

Zitat von EWeiss (Beitrag 1109921)
na ja mal ne dumme frage warum verwendest du dann nicht GetMenu(dein handle) ?
dann über GetMenuItemCount(ermitteltes handle) die einträge auslesen

gruss

Danke für die Antwort! Und: Es gibt keine Dummen Fragen!

Die Idee hört sich gut an. Allerdings erhalte ich ja über GetMenu schon nicht das passende Handle. Denn Ansonsten würde ich Items einfügen können. GetMenuItemCount(); bringt mir daher m.E. nichts. So erhalte ich immer -1 für folgende Aufrufe:
Delphi-Quellcode:
lMenu:=GetMenu(self.Handle);
Caption:=IntToStr(GetMenuItemCount(lMenu));
lMenu:=GetMenu(Memo1.Handle);
Caption:=IntToStr(GetMenuItemCount(lMenu));
Gruß

EWeiss 4. Jul 2011 16:20

AW: Fremdes PopupMenu erweitern
 
Zitat:

Zitat von Schwedenbitter (Beitrag 1109922)
Zitat:

Zitat von EWeiss (Beitrag 1109921)
na ja mal ne dumme frage warum verwendest du dann nicht GetMenu(dein handle) ?
dann über GetMenuItemCount(ermitteltes handle) die einträge auslesen

gruss

Danke für die Antwort! Und: Es gibt keine Dummen Fragen!

Die Idee hört sich gut an. Allerdings erhalte ich ja über GetMenu schon nicht das passende Handle. Denn Ansonsten würde ich Items einfügen können. GetMenuItemCount(); bringt mir daher m.E. nichts. So erhalte ich immer -1 für folgende Aufrufe:
Delphi-Quellcode:
lMenu:=GetMenu(self.Handle);
Caption:=IntToStr(GetMenuItemCount(lMenu));
lMenu:=GetMenu(Memo1.Handle);
Caption:=IntToStr(GetMenuItemCount(lMenu));
Gruß

Ich habe ein Programm in Delphi geschrieben mit dem man fremde Menüs Fernsteuern kann!
Bei bedarf lade ich es als Open Source mal hoch.
Denke da ist was passendes dabei mit dem du weiterarbeiten könntest.

gruss

Schwedenbitter 4. Jul 2011 16:29

AW: Fremdes PopupMenu erweitern
 
Zitat:

Zitat von EWeiss (Beitrag 1109923)
Ich habe ein Programm in Delphi geschrieben mit dem man fremde Menüs Fernsteuern kann!
Bei bedarf lade ich es als Open Source mal hoch.
Denke da ist was passendes dabei mit dem du weiterarbeiten könntest.

gruss

Bedarf!

Der Screenshot sieht vielversprechend aus. Kann man damit "nur" Menüs oder auch - wie von mir benötigt - PopupMenüs fernsteuern. Dann wäre es etwas für mich. Denn wenn man das mit fremden Programmen kann, sollte es innerhalb der eigenen Application erst Recht funktionieren.

Hier im Forum gibt es mehrere Themen dazu. Diese kommmen alle zu dem Ergebnis, dass man das PopupMenü lieber selbst (nach)schreiben und dann die weiteren Einträge hinzufügen sollte. Das finde ich nicht so elegant.

Gruß

EWeiss 4. Jul 2011 16:35

AW: Fremdes PopupMenu erweitern
 
Zitat:

Zitat von Schwedenbitter (Beitrag 1109925)
Zitat:

Zitat von EWeiss (Beitrag 1109923)
Ich habe ein Programm in Delphi geschrieben mit dem man fremde Menüs Fernsteuern kann!
Bei bedarf lade ich es als Open Source mal hoch.
Denke da ist was passendes dabei mit dem du weiterarbeiten könntest.

gruss

Bedarf!

Der Screenshot sieht vielversprechend aus. Kann man damit "nur" Menüs oder auch - wie von mir benötigt - PopupMenüs fernsteuern. Dann wäre es etwas für mich. Denn wenn man das mit fremden Programmen kann, sollte es innerhalb der eigenen Application erst Recht funktionieren.

Hier im Forum gibt es mehrere Themen dazu. Diese kommmen alle zu dem Ergebnis, dass man das PopupMenü lieber selbst (nach)schreiben und dann die weiteren Einträge hinzufügen sollte. Das finde ich nicht so elegant.

Gruß

Alle ;) Fenster von dem du ein Handle in erfahrung bringen kannst und die ein Menü haben selbstverständlich :)
Habs glaube ich nur für Standard/System Menüs erstellt schon lange her..
Teste es einfach dann kannst sehen ob du es gebrauchen kannst.

PS:
Alternativ könntest du dein Popupmenu zerstören und einfach während der laufzeit mit neuen Einträgen
erweitern bzw.. neu einladen (aber zur Laufzeit ;))

Ich mache das genauso.

gruss

Luckie 4. Jul 2011 19:39

AW: Fremdes PopupMenu erweitern
 
Self.Handle dürfte nicht das Handle des Memos auf deiner Form, sondern die Form selber sein.

Luckie 4. Jul 2011 21:18

AW: Fremdes PopupMenu erweitern
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Menu: THandle;
begin
  Menu := GetMenu(Memo1.Handle);
  if Menu <> 0 then
  begin
    if not InsertMenu(Menu, 0, MF_BYPOSITION or MF_STRING, 0, 'Test') then
      RaiseLastOSError;
  end
  else
    RaiseLastOSError;
end;
Ich glaube, das mit dem Kontextmenü funktioniert nicht, weil es nicht sichtbar ist. Es wird erst erzeugt, wenn es aufgerufen wird.

EWeiss 4. Jul 2011 21:23

AW: Fremdes PopupMenu erweitern
 
Wird schon gehen ;)
Man kann das mit einem trick bewerkstelligen das Kontexmenü erstellen aber mit Focus unterdrücken
damit du es nicht siehst anschließend könnte man (also meine Idee) trotzdem an die Einträge kommen.

Beispiel Textbox:

Wie bekannt hat eine Textbox ein eigenes Kontexmenü das kann man aber unterdrücken in dem man vorher beim RButtonClick
diese auf Enabled False stellt anschließend wieder auf true dann den Focus auf die TextBox setzen und dann dein eigenes Popupmenu anzeigen lassen.

Meine idee auch wenn das menü unterdrückt wird müßte es eigentlich ausgelößt sein um daraus Daten entnehmen zu können.

gruss

Luckie 4. Jul 2011 21:31

AW: Fremdes PopupMenu erweitern
 
Ich würde das Memo irgendwie subklassen oder den Aufruf des Kontextmenüs hooken.

Björn Ole 4. Jul 2011 23:50

AW: Fremdes PopupMenu erweitern
 
Zitat:

Zitat von Luckie (Beitrag 1109956)
Es wird erst erzeugt, wenn es aufgerufen wird.

Genau das war bei mir auch der Fall.

Hier mal das Wichtigste aus meiner hook.dll:
Delphi-Quellcode:
mmfData^.hHookWndProc := SetWindowsHookEx(WH_CALLWNDPROC, @HookWndProc, hInstance, TID);

function HookWndProc(Code: Integer; wParam: wParam; lParam: lParam): Integer;
  stdcall;
var
  cwp: PCWPSTRUCT;
begin
  Result := CallNextHookEx(mmfData^.hHookWndProc, Code, wParam, lParam);
  if Code >= 0 then
  begin
    cwp := PCWPSTRUCT(lParam);
    case cwp.message of
      WM_INITMENU:
        AddPopupItem(cwp.wParam);
    end;
  end;
end;

// - fügt dem PopupMenu mit Handle hPopup einen Eintrag "&Advanced" an zweiter Stelle ein
// - es handelt sich um das richtige PopupMenu, wenn die Anzahl der MenuItems = 8 und der Text des ersten MenuItems = "&Open" ist
procedure AddPopupItem(hPopup: Cardinal);
var
  mii: TMENUITEMINFO;
  s: string;
  len: Integer;
begin
  if GetMenuItemCount(hPopup) = 8 then
  begin
    len := GetMenuString(hPopup, 0, nil, 0, MF_BYPOSITION);
    if (len > 0) then
    begin
      SetLength(s, len + 1);
      GetMenuString(hPopup, 0, PChar(s), len + 1, MF_BYPOSITION);
      if Pos('&Open', s) > 0 then
      begin
        s := '&Advanced';
        ZeroMemory(@mii, sizeof(TMENUITEMINFO));
        mii.cbSize := sizeof(TMENUITEMINFO);
        mii.fMask := MIIM_TYPE;
        mii.dwTypeData := PChar(s);
        mii.cch := Length(s);
        InsertMenuItem(hPopup, 1, true, mii);
      end;
    end;
  end;
end;
Falls du noch etwas brauchst, sag Bescheid.

EWeiss 5. Jul 2011 05:07

AW: Fremdes PopupMenu erweitern
 
Zitat:

es handelt sich um das richtige PopupMenu, wenn die Anzahl der MenuItems = 8 und der Text des ersten MenuItems = "&Open" ist
Jo und wer garantiert dir das?

gruss

Björn Ole 5. Jul 2011 19:17

AW: Fremdes PopupMenu erweitern
 
Solang es keinen anderen gibt, der wie ich an den PopupMenus rumschraubt, hab ich da keine Bedenken, zumal ich mein Tool nur privat einsetze.

EWeiss 5. Jul 2011 19:33

AW: Fremdes PopupMenu erweitern
 
Zitat:

Zitat von Björn Ole (Beitrag 1110154)
Solang es keinen anderen gibt, der wie ich an den PopupMenus rumschraubt, hab ich da keine Bedenken, zumal ich mein Tool nur privat einsetze.

Ist nicht bösgemeint oder eine Anmache ;)
Ich denke nur er wollte fremde popupmenus erweitern.

und da weiss er ja nicht wo was steht.

Im eigenen wird das gehn da du ja weist wo was stehen muss bz. steht um erfolg zu haben.

gruss

Björn Ole 5. Jul 2011 22:26

AW: Fremdes PopupMenu erweitern
 
War auch nicht so aufgefasst. :)

Meine Antwort war aber schon auf ein fremdes Programm ausgelegt. Um genau zu sein handelte es sich um Bei Google suchenProxifier v2.9, dessen TrayMenu ich um einen Eintrag erweitert habe.

EWeiss 5. Jul 2011 22:55

AW: Fremdes PopupMenu erweitern
 
Zitat:

Zitat von Björn Ole (Beitrag 1110191)
War auch nicht so aufgefasst. :)

Meine Antwort war aber schon auf ein fremdes Programm ausgelegt. Um genau zu sein handelte es sich um Bei Google suchenProxifier v2.9, dessen TrayMenu ich um einen Eintrag erweitert habe.

Werde das demnächst mal testen ;)
Vielleicht kann ich es ja in mein Tool Fremde Menüs steuern mit einbauen.
Wenn es sinn macht das zu integrieren.

Hier in Win7 funktionieren die meisten Menüs nicht mehr so wie ich da sehe.
abgesehen von NotePad, cmd und die gängigen Tools.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:11 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