2012-02-18 8 views
2

Delphi XEアプリケーションは、別のアプリケーションのウィンドウ内にポップアップメニューを表示するにはどうしたらいいですか?アイデアは、バックグラウンドで実行されているヘルパータイプのアプリです。登録されたホットキーでは、アプリケーションは、テキストキャレットまたはマウスカーソルの近くにポップアップメニューを表示する必要があります。共通しているん別のアプリケーションのウィンドウにポップアップメニューを表示

アプリケーションは、ここにAutoHotkeyによって作成され、テキストエディタで表示されるメニューです:

popup menu attached to another application's window

私は私が求めているものを推測です:どのように私はでポップアップメニューを表示することができます任意の画面の場所、が添付されていませんをDelphiコントロールに追加しましたか?

答えて

3

適切なメニュー項目を使用してTPopupMenuを作成します。あなたがそれを表示する必要があるときは、Popupを呼び出して、スクリーン座標の左上の位置を渡します。

PopupMenu1.Popup(X, Y); 
+1

しかし、この方法でメニューを表示してもキーボードフォーカスは得られません。それがなければ、マウス以外でメニューを操作することはできません。 –

+0

どのように表示するか教えてください。ホットキーから? –

+0

はい、ホットキーから、Popup()メソッドを使用します。私は、メニューを表示する直前にSetForegroundWindow(self.Handle)と言うと、ポップアップメニューにキーボードフォーカスが得られることを発見しました。私のアプリが最小化されている場合、これはアプリケーションのウィンドウには影響がなく、メニューの問題を修正します。しかし、私のアプリが**最小化されていない**場合、それはフォアグラウンドにプッシュされ、メニューが閉じられた後にフォーカスを取得します。これは私が排除する必要がある(またはこの副作用を持たない別の回避策を見つける)必要な行動です。 –

2

@DavidHeffernanがあなたの質問に答えましたが、正しい質問をしていない可能性があります。

ユーザーがいくつかのアプリケーションを実行していて、ホットキーを検出し、メニューを表示してから、選択したメニュー項目に基づいて何らかのアクションを実行できるようにしたいとします。カーソルの下の単語など、ユーザーのコンテキスト)。これは、単に任意の画面座標にメニューを表示するよりも複雑です。

他のプログラミング言語でこれを複製しようとするのではなく、AutoHotKeyを使用することをお勧めします。あなたがこれを認識していない場合、あなたのコードがAutoHotKeyスクリプトを実行することは可能です。 IIRCを使用すると、AHKスクリプトをコンパイルできるので、コンパイルされたスクリプトだけでAHKをインストールする必要はありません。 AHKは最も洗練されたソリューションではないかもしれませんが、深みと成熟しています。

これができない場合は、Windows HooksとDLL Injectionを調べることをお勧めします。既存のコードやフレームワークを見つけることができない限り、これはかなりの労力を必要とします。

この複雑さの理由は?他のプログラムをスムーズに増やすには(フォーカスなどの問題にぶつかることなく)、コードを他のプログラムの一部として実行したいと思っています。これの仕組みはDLL注入を介して行うことができます。しかし、これは最初のステップにすぎません。コードが適切なコンテキストで実行されると、コードは「ホスト」プログラムと相互運用する必要があります。これは難しいことがあります(WindowsメッセージングとWindows APIについて深い経験があれば役に立ちます)。これを任意のプログラムでスムーズに動作させたい場合は、さらに難しくなります。

+0

ああ、AHKは本当に美しく、私はそれをたくさん使っています。このケースでは、AHKよりもはるかに専門的なものを試していますが、特定のタスクに焦点を当てています。フレンドリーなGUIと重大な頭痛を誘発しないスクリプト言語を使っています。 AHKのソースコードからは、AHKはフックのDLL注入を使用しないので、私はどちらかにする必要はないと推測しています。フックはメニューに役立つでしょうか? –