4

Windows でアクティブなアプリケーションではない特定のアプリケーションに pressKey イベントを送信したいので、sendMessage/postMessage API 呼び出しを使用する必要があります。

ただし、アプリケーションでアクティブになっている正確な子ウィンドウを知り、それに pressKey メッセージを送信する必要があります...

GetTopWindow および GetWindow(GW_CHILD) API 呼び出しを使用して、メイン ウィンドウの一番上の子ウィンドウを取得し、取得した子ウィンドウで再度実行して一番上の grandchildWindow を取得し、子ウィンドウがなくなるまでそれを続けました。 . これは一部のアプリケーションではうまく機能しますが、場合によっては機能しません。親ウィンドウが子ウィンドウではなくアクティブなウィンドウである場合があるため、親の最上位の子ウィンドウを取得しても、メッセージが間違ったウィンドウに送信されてしまいます。

これを行う唯一の方法 (実際のアクティブなウィンドウのハンドラーを取得する) は、GuiThreadInfo API 呼び出しを使用することでしたが、ターゲット アプリケーションが Windows でアクティブなアプリケーションである場合にのみ機能します。冒頭で述べたように、ハンドラが null になるわけではありません。

setForegroundWindow api 呼び出しを使用してアプリケーションを最上位に移動できますが、これはしたくありません。また、AttachThreadInput および GetFocus api 呼び出しも試しましたが、ターゲット アプリケーションが Windows のアクティブなアプリケーションである場合にのみ機能します。

何か案は?ありがとう

4

2 に答える 2

1

あなたが試したことから、あなたはメインウィンドウへのハンドルを取得する方法を知っていると思いますが、コメントを残すだけでなく、そのためのスニペットを投稿します.

これを理解するためにネットで見つけたいくつかのものを組み合わせましたが、主なものはこれです. これをテストするための優れたアプリはありませんが、単純なケースでは機能します。1 つの例外は、アプリケーションでツール ウィンドウを使用する場合、GetLastActivePopup メソッドにはそれらが含まれていないと思うため、コード化されているため、それが見つからないことです (それについては不明であり、そのケースをテストしていません)。

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool IsWindowVisible(IntPtr hWnd);

[DllImport("user32.dll")]
static extern IntPtr GetLastActivePopup(IntPtr hWnd);

[DllImport("user32.dll", ExactSpelling = true)]
static extern IntPtr GetAncestor(IntPtr hwnd, uint gaFlags);

const uint GA_PARENT = 1;
const uint GA_ROOT = 2;
const uint GA_ROOTOWNER = 3;

    public static IntPtr GetAppActiveWindow(IntPtr hwnd)
    {
        IntPtr activeAppWindow = IntPtr.Zero;

        if (hwnd != IntPtr.Zero)
        {
            //Get the root owner window (make sure we are at the app window
            //if you already have a handle to the main window shouldn't have 
            //to do this but I put it in just in case
            hwnd = GetAncestor(hwnd, GA_ROOTOWNER);

            while ((activeAppWindow = 
                      GetLastActivePopup(hwnd)) != activeAppWindow)
            {
                if (IsWindowVisible(activeAppWindow))
                    break;
                hwnd = activeAppWindow;
            }
        }

        return activeAppWindow;
    }
于 2009-05-16T00:22:54.727 に答える
0

WindowのタイトルとWindowクラス名がわかっている場合は、FindWindow()とFindWindowEx()を調べて、それらがニーズを満たしているかどうかを確認してください。

FindWindow():http: //msdn.microsoft.com/en-us/library/ms633499.aspx
FindWindowEx( ):http://msdn.microsoft.com/en-us/library/ms633500(VS.85 )。 aspx

于 2009-05-16T01:57:20.490 に答える