| 

.NET C# Java Javascript Exception

5
Hallo Codekickers,

ich möchte in einer externen Delphi-Anwendung einen Menüeintrag zu einem vorhandenen Menü hinzufügen (Anmerkung: Ich habe keine zweifelhaften Beweggründe dazu kann diese hier aber auch nicht weiter ausführen. Das Abfangen von Menüclicks ist kein Problem aber ich hätte es gerne etwas komfortabler für den User).

Verwendete Programmiersprache ist VB6 aber da es eh reine API-Aufrufe sind, ist es mir eigentlich egal, in welchem Dialekt das diskutiert wird :) Es gibt zahlreiche Beispiele dafür, wie man MenüItems anfügen (siehe Notepad) und diese funktionieren auch problemlos. Allerdings nicht in dieser speziellen Delphi-Anwendung.

Ich habe mir daraufhin testweise mal eine Freeware-Delphi-Anwendung heruntergeladen (TTCamera und dort versucht, MenuItems anzufügen oder auch zu löschen. Ebenso ohne Erfolg.

Der Aufruf selbst ist ja sehr trivial (hier zum Löschen eines Eintrages):
Dim hMenu As Long
Dim hSubMenu As Long
Dim lret As Long
Dim cnt As Long

hMenu = GetMenu(m_Hwnd)
hSubMenu = GetSubMenu(hMenu, 0)
lret = RemoveMenu(hSubMenu, 1, MF_BYPOSITION)
lret = DrawMenuBar(m_HWnd)


Resultat: Menüeintrag ist immer noch da. Sowohl RemoveMenu als auch DrawMenuBar geben 1, also Success, zurück. Beim Notepad funktioniert dies, bei Delphi-Anwendungen nicht? Wäre dankbar, falls hier jemand von Euch eine Idee hat.

Beim hinzufügen eines Menüeintrages, das ebenfalls nicht "funktioniert", bin ich auf ein merkwüdiges Phänomen gestossen. GetMenuItemCount gibt mir vorm Anfügen 18 zurück, nach dem Anfügen korrekterweise 19. Und auch nachdem ich in der externen Anwendung ein paar Menüeinträge auf- und zugeklappt habe, bestätigt mir ein später ausgeführter Count, das immer noch 19 Items da sind. Es wird jedoch nur nicht angezeigt. Darum sollte sich eigentlich DrawMenuBar kümmern. Auf der anderen Seite ist es mir nicht gelungen, den Text eines vorhandenen Items auszulesen, was ich aber mitunter auf die prozessübergreifenden Zugriffe schieben möchte.

Um die Abstürze zu vermeiden behelfe ich mir momentan damit, das in meiner Hook-Funktion erst einmal den MenuClick unterdrücke, dann eine MessageBox ausgebe und, je nachdem wofür sich der User entscheidet, dann per Postmessage und WM_Command u.U. den Menüeintrag nochmal starte und dann im Hook diesen einen Vorgang ignoriere. Aber da bleibt irgendwie ein flaues Gefühl zurück und nebenbei wäre es für die User schöner, wenn sie zwei Menüeinträge hätten. (Nein, der Quellcode ist nicht verfügbar, sonst würd ich mir den Stress nicht machen).
20.10.2011
Jens Duczmal 2,6k 1 3 9
Jens Duczmal 2,6k 1 3 9
Titel geändert, der alte klang doch etwas ungünstig.
Jens Duczmal 20.10.2011
TOP TECHNOLOGIES CONSULTING GmbH