delphi - Vis en pop op-menu i et andet programs vindue

Indlæg af Hanne Mølgaard Plasc

Problem



Hvordan kan en Delphi XE-applikation vise en popup-menu i et andet programmets vindue? Ideen er, at en hjælper-app skal køre i baggrunden. På en registreret genvejstastning skal programmet vise en popup-menu nær tekstbilledet eller musen cursoren.


Applikationer, der gør det, er almindelige, her er en menu oprettet af AutoHotkey og vist i en tekstredigerer: [4]


popup-menuen er knyttet til et andet programs vindue


Jeg gætter, hvad jeg spørger er: Hvordan kan jeg vise en popup-menu på en vilkårlig skærmplacering, uden at blive vedhæftet til en Delphi-kontrol?

Bedste reference


Opret en TPopupMenu med de relevante menupunkter. Når du skal vise det, skal du blot ringe Popup, der passerer øverste venstre position i skærmkoordinater. [5]


PopupMenu1.Popup(X, Y);

Andre referencer 1


@DavidHeffernan besvarede dit spørgsmål, men du har måske ikke stillet det rigtige spørgsmål.


Lad os tage det eksempel du gav: brugeren kører nogle arbirary applikationer, og du vil kunne opdage en genvejstast, vise en menu og derefter tage nogle handlinger baseret på det valgte menupunkt (og måske endda brugeren ' s kontekst, såsom ordet under markøren). Dette er mere kompliceret end blot at vise en menu ved vilkårlig skærmkoordinater.


Min anbefaling er at bruge AutoHotKey i stedet for at prøve at replikere dette på et andet programmeringssprog. Hvis du ikke er opmærksom på dette, er det muligt for din kode at køre AutoHotKey-scripts. IIRC, du kan kompilere AHK-scripts, så du ikke behøver at installere AHK, bare de udarbejdede scripts. AHK er måske ikke den mest elegante af løsninger, men den har dybde og modenhed.


Hvis dette ikke er muligt, foreslår jeg, at du undersøger Windows Hooks og DLL Injection. Medmindre du kan finde nogle eksisterende kode eller rammer, vil det medføre en del arbejde.


Årsagen til denne kompleksitet? For at udvide et andet program smidigt (uden at løbe ind i problemer med fokus osv.), Vil du have din kode køre som en del af det andet program. Mekanikken herfor kan ske via DLL-injektion. Men det er kun det første skridt. Når din kode kører i den rigtige kontekst, skal din kode interagere med værtsprogrammet. Det kan være vanskeligt (det hjælper, hvis du har stor erfaring med Windows messaging og Windows API). Hvis du vil have dette til at fungere problemfrit med ethvert vilkårlig program, bliver det endnu sværere.