1

この問題があります。特定のアプリケーションの mainWindow へのハンドラーがあり、そのアプリケーションでキープレスをシミュレートしたい...

これを行うために sendMessage/postMessage API 呼び出しを使用しています。.Net SendKeys 関数または win32 API の keybd_event を使用しない理由は、それらがグローバル レベルでキープレスをシミュレートするためです。私の場合、アプリケーションを最小化しても、キープレスをシミュレートしたい場合があります。

sendMessage と postMessage の問題は、キーを押したい正確な子ウィンドウのハンドラーを渡す必要があることです。たとえば、メモ帳では、キーを mainWindow に送信しても何も起こらず、基本的に書き込み可能な白いキャンバスで構成される子ウィンドウにキーを送信する必要があります。

たとえば、msPaint では、ユーザーが新しいドキュメントを作成し、その図面でテキスト ボックスを開き、そこでキー押下をシミュレートしたい場合、メインウィンドウの子ウィンドウの子ウィンドウを取得して動作させる必要があります。

そこで、あらゆる状況でうまくいくと思われる方法を見つけました。基本的には、パラメータ GW_CHILD を指定して getWindow を使用し、Z 値が最も高い子ウィンドウを取得しました。次に、子ウィンドウに対してもう一度実行し、特定の childWindow に childWindows がなくなるまで実行を続けます。

そしてそれはうまくいったようで、私はとても幸せでした!

しかし...これが機能しないケースを見つけました。Firefox はその 1 つです。Firefox には mainWindow があり、次に mainWindow とほぼ同じ childWindow があり、さらに別の childWindow があります。これはウェブサイト領域、つまりアドレスバーとメニューの下の領域です。たとえば、私が www.google.com にいて、フォーカスされた検索ボックスでキープレスをシミュレートしたい場合、それは機能します。子ウィンドウの子ウィンドウを取得すると、正しい childWindow が得られます。ただし、たとえばユーザーがアドレス バーをクリックしても、getWindow の動作は何も変わりません。アドレスバーのキープレスをシミュレートする代わりに、アドレスバーの下にある子ウィンドウを最終的に取得し、何もしません。

問題は、特定のアプリケーションのアクティブな子ウィンドウを取得する方法が見つからないことです。GetWindow メソッドを使用して特定のウィンドウの子ウィンドウを取得し、子ウィンドウのない子ウィンドウが見つかるまでそれを実行することしかできません。ただし、Firefox のケースで見たように、アクティブなウィンドウは実際には、最終的に得られる子ウィンドウの親です。

getTopWindow などの他の API 呼び出しを試しましたが、うまくいきませんでした..

誰でもこの問題に光を当てることができますか? ありがとう!

4

2 に答える 2

0

アプリケーションがウィンドウのウィンドウ規則に違反している場合は、例外が必要になります。

Mozilla では、次のようになります (IIRC):

  • このクラスの「神」ウィンドウがありMozillaUIWindowClass、そのウィンドウ テキストに「- Mozilla Firefox」という文字列があります。
  • アドレスバーの位置がわかっている場合は、次の関数を使用できます。

そしてHWND、「神」ウィンドウとアドレスバーの位置を提供します。

HWND ChildWindowFromPoint(HWND, POINT);

おそらくもっと良い解決策があります。位置ベースのマウスを自動化する必要があったため、これを思いつきました。

詳細については、特定のソフトウェアのソースを参照するか、Spy+ で 1 日を過ごす必要がある場合があります。:>

于 2009-05-06T20:25:24.367 に答える