0

アプリケーション用にC#で小さなGUIテスト自動化ツールを構築しています。テストツールの機能の1つは、テストされたアプリケーションからポップアップするダイアログを閉じることです。

私が抱えている問題は、完全なクラス名を付けずにクリックするボタンを見つけることです。FindWindowExメソッドを使用して、クリックしたいダイアログボックスとボタンを取得しました。ボタンのキャプションは知っていますが、問題はボタンのクラス名も指定する必要があることです。クラス名は常に同じではありませんが、「WindowsForms10.BUTTON.app.0.3ce0bb8」のようになります。たとえば、アプリケーションをローカルで起動するか、クリックワンスで起動するかによって、「3ce0bb8」の最後の部分が異なります。

だから、私の質問は、この「WindowsForms10.BUTTON.app」のようなクラスの最初の部分(常に同じ)を指定するだけでボタンを見つけるにはどうすればよいですか?または他の方法でこれを解決できますか?

dllのインポートは次のようになります。

[DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string pszWindow);

ボタンをクリックしようとすると、私のコードは次のようになります。

private void SendDialogButtonClick(IntPtr windowHandle, ApplicationStartType applicationStartType)
    {
        if (applicationStartType == ApplicationStartType.Localy)
            buttonClassName = "WindowsForms10.BUTTON.app.0.3ce0bb8";
        else if (applicationStartType == ApplicationStartType.ClickOnce)
            buttonClassName = "WindowsForms10.BUTTON.app.0.3d893c";

        // Find the "&No"-button
        IntPtr buttonAndNoHandle = FindWindowEx(windowHandle, IntPtr.Zero, buttonClassName, "&No");

        // Send the button click event to the appropriate button found on the dialog
        if (buttonAndNoHandle.ToInt64() != 0)
        {
            SendMessage(new HandleRef(null, buttonAndNoHandle), WM_CLICK, IntPtr.Zero, IntPtr.Zero);
        }
    }
4

1 に答える 1

2

はい、それは難しいです。クラス名は自動生成されます。FindWindowEx()を使用することはできません。EnumChildWindows()とGetClassName()を使用してコントロールを反復処理する必要があります。

Managed Spyツールのソースコードを調整して、これらすべてをはるかに簡単かつクリーンにすることができます。

于 2010-08-06T13:36:24.110 に答える