2009-05-06 10 views
5

Die Ziel-App ist in Delphi geschrieben (Win32 nicht .NET) und ist Closed-Source.Wie programmgesteuert wählen Sie einen Kontextmenüeintrag in einer anderen App?

Die Aktion, die ich aufrufen möchte, heißt Kopie, aber es gibt keine offensichtliche Tastenkombination. (Strg + Einfügen tut das Falsche und Strg + C tut nichts)

Ich kann mein Ziel HWND finden und überreden es das Kontextmenü zu öffnen (es reagiert auf WM_RBUTTONDOWN/UP nicht). Aus dem Menü HWND kann ich sogar das Menü-Handle über MN_GETHMENU erreichen und den gewünschten Menüpunkt finden. Ich weiß nur nicht, wie ich den Gegenstand "wählen" soll. Es hilft nicht, dass das Menü "modeless" ist, dh. seine HWND ist nicht im Besitz, so dass ich nicht weiß, welche von vielen versteckten Windows ist der echte Besitzer - sonst könnte ich wahrscheinlich nur senden Sie eine WM_COMMAND und nicht einmal Pop-up-Menü, was vorzuziehen wäre.

Obwohl ich sicher bin, dass es alle Arten von Hacks erleichtert, würde ich es vorziehen, Code nicht in den Zielprozess zu injizieren.

Antworten in jeder Sprache akzeptiert.

+0

Ich denke, es würde einige Auswirkungen auf die Sicherheit haben, wenn so etwas möglich wäre, denn das würde bedeuten, dass man denken kann, dass sie Eingaben von der Tastatur/Maus bekommen Tatsächlich kommt es von einer anderen App! Momentan fällt mir jedoch kein konkretes Beispiel ein ... – Paggas

+0

Wenn Sie nicht vertrauenswürdige Apps ausführen, haben Sie ohnehin schon verloren. Aber das wirft einen Punkt auf - das funktioniert auf XP ... Ich frage mich, ob es unter Vista/7 funktionieren würde? –

Antwort

8

Anscheinend können Sie es senden WM_RBUTTONDOWN/UP Nachrichten und es reagiert. Wenn ja, können Sie auch WM_KEYDOWN/UP Nachrichten senden? Solange Sie die Struktur des Menüs kennen und sich nicht ändern, versuchen Sie der App zu sagen, dass jemand den Abwärtspfeil X mehrmals drückt und dann die EINGABETASTE drückt. Das scheint die einfachste Lösung für mich zu sein ...

+0

Danke, das hat funktioniert, obwohl ich der Kürze halber WM_CHAR und nicht WM_KEYDOWN/UP gesendet habe. –

+0

Auch ich habe gerade die Taste losgelassen, nicht Cursor nach unten/eingeben. –

+0

OK, das funktioniert auch. (Sie haben nicht erwähnt, ob es einen hatte.) –