2010-12-15 7 views
0

にクラス名によって要素を見つけます。user32.dllのFindWindowEx、私はコマンドラインアプリケーションから起動されているWPFアプリケーションを持っているリモートWPFウィンドウ

私はいくつかの簡単な自動化を(など、いくつかのボタンをクリックし、設定/テキストを取得)を実行しようとしています。私はWPFで子ウィンドウのいずれかを見つけることができないようです。

私はWPFとUIAフレームワーク、リサイズやWinAPIので作業モデルを持っていますが、うまくプレーするWinAPIのとWPFのように見えることはできません。

私はUISpy、WinSpy ++、Winspector、UIA Verifyアプリを使ってコントロールなどを見てきましたが、WinFormsと同じ情報をWPFに持たないようです。

例えば、WinFormsアプリケーションでは、スパイツールを使用すると、ClassNameが "WindowsForms10.EDIT.app.0.33c0d9d"のテキストボックスが表示されます。要素が存在していることを確認し、 "TextBox"を報告するのは、UIA Automation Verifyアプリだけです。

私の質問は、どのように正しいクラス名が渡されるのか、または子要素を見つけるための簡単なルートがあるかどうかです。

// does not work in wpf 
IntPtr child = NativeMethods.FindWindowEx(parent, prevElement, "TextBox", null); 

// works in winforms 
IntPtr child = NativeMethods.FindWindowEx(parent, prevElement, "WindowsForms10.EDIT.app.0.33c0d9d", null); 

、ここでは、私が使用していますuser32.dllの輸入です:あなたがWPFを自動化したい場合は

public class NativeMethods 
{ 
    public const int WM_SETTEXT = 0x000C; 
    public const int WM_GETTEXT = 0x000D; 
    public const uint CB_SHOWDROPDOWN = 0x014F; 
    public const uint CB_SETCURSEL = 0x014E; 
    public const int BN_CLICKED = 245; 
    public const uint WM_SYSCOMMAND = 0x0112; 
    public const int SC_CLOSE = 0xF060; 

    [DllImport("user32.dll", SetLastError = true)] 
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

    [DllImport("user32.dll", SetLastError = true)] 
    public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle); 

    [DllImport("user32.dll", SetLastError = false)] 
    public static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem); 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
    public static extern IntPtr SendMessage(HandleRef hWnd, uint Msg, IntPtr wParam, string lParam); 

    [DllImport("user32.dll")] 
    public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam); 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
    public static extern int SendMessage(int hWnd, int Msg, int wParam, StringBuilder lParam); 


} 

答えて

3

、あなた UIオートメーション、過去のない「古いものを使用する必要があります。 "windows API :-)。

ここUIオートメーションの良い導入があります:White on codeplexBugslayer: GUI Control to Major Tom

UIオートメーションを活用し、「白」という名前の興味深いオープンソースプロジェクトもあります。あなたが掘るしたい場合は、いくつかのサンプルがそこにあります。

+0

私はずっとUIオートメーションルートを好みます。私はこれをWPFやUIオートメーション、そしてWinFormsとWinAPIで動作させています。この練習の一部は、この(WPAP with WinAPI)が実行可能かどうかを判断することでした。以下のコメントから、WinFormsやそれ以前のアプリ、WinAPIはオプション、WPF以降はUI Automationを使用しているようです。ありがとう! – ajberry

+0

まあ、それは従来のMSAA(アクセシビリティ)SDKに頼ることができるので、UIオートメーションはまた、通常のWindowsとWinformsのために働く、しかし、私の経験ではサポートは、すべてのプラットフォーム間で完全に一致していないことを示しています。しかし、はいUIオートメーションを使用すると、サーバー側のコードを所有している場合、あなたは外部クライアントの取り扱いを容易に自動化ピアと独自のコントロールとのUIElementを装備することができ、本当にWPFのために行くための方法ですプラス。 –

関連する問題