2012-05-07 55 views
4

自分のマシンにデスクトップアプリケーションがインストールされています。私がプログラムを始めると、ある種のウィンドウが開きます。このようなもの(単なる例)、のは言わせて:ウィンドウでデータをキャプチャする方法

enter image description here

だから、私はこのウィンドウを見つけて、そこからいくつかのデータをキャプチャしますC#でアプリケーションを書きたいです。

どのツールを使用しますか?私は、少なくとも抵抗の道に行きたいです。

テキストボックスから画像やテキストをキャプチャする必要があります。テキストでコントロールを見つけてクリックする必要があります。

答えて

1

どのようなデータをキャプチャしようとしていますか?

Windowsのメッセージを聞いたり、メモリを読み込んだりすることがあります。

+0

TExtboxes \ picturesまた、ボタンをクリックすることにしました。どのくらい正確に私はWindowsのメッセージを聞く必要がありますか? – user194076

+0

この記事を見て:http://stackoverflow.com/questions/9665579/setting-up-hook-on-windows-messagesそしてspy ++で遊んでみてください(http://technet.microsoft.com/en- us/library/dd460725.aspx) – animaonline

2

あなたはそのプロセスのすべてのウィンドウのハンドルを列挙開始する必要があります:

https://stackoverflow.com/a/2584672/351383

次に、各取り扱いのためのテキストと位置に関する情報を取得し、位置INFOMATIONであなたが得るために、その位置にデスクトップのスクリーンショットを取ることができます画像AFAIKは、実行中のアプリケーションのウィンドウから画像を取得する他の方法はありません。

:あなたがコントロールの画面位置を得たとき

その後、いくつかのテキストのために、マウスの左クリックをシミュレートするために、下記のリンクから、検索ウィンドウを使用して、コントロール内のいくつかのポイントをクリックして、ここでのポイントをクリックします方法であり、

https://stackoverflow.com/a/10355905/351383

私は、プロセスのためにそのデータを収集するために迅速なクラスtoghether置く:その後、ノーあり

public static class ProcessSpy 
    { 
    public static List<ProcessSpyData> GetDataForProcess(string processName) 
    { 
     var result = new List<ProcessSpyData>(); 
     Process myProc = Process.GetProcessesByName(processName).FirstOrDefault(); 
     if (myProc != null) 
     { 
     var myHandles = EnumerateProcessWindowHandles(myProc); 
     foreach (IntPtr wndHandle in myHandles) 
     { 
      result.Add(new ProcessSpyData(wndHandle)); 
     } 
     } 
     return result; 
    } 

    delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam); 

    [DllImport("user32.dll")] 
    static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn, IntPtr lParam); 

    static IEnumerable<IntPtr> EnumerateProcessWindowHandles(Process prc) 
    { 
     var handles = new List<IntPtr>(); 

     foreach (ProcessThread thread in prc.Threads) 
     EnumThreadWindows(thread.Id, (hWnd, lParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero); 

     return handles; 
    } 
    } 

    public class ProcessSpyData 
    { 
    private const uint WM_GETTEXT = 0x000D; 

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

    [DllImport("user32.dll")] 
    private static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect); 

    [StructLayout(LayoutKind.Sequential)] 
    private struct RECT 
    { 
     int left, top, right, bottom; 

     public Rectangle ToRectangle() 
     { 
     return new Rectangle(left, top, right - left, bottom - top); 
     } 
    } 

    [DllImport("user32.dll")] 
    static extern bool ClientToScreen(IntPtr hWnd, ref Point lpPoint); 

    public IntPtr WindowHandle { get; private set; } 
    public string WindowText { get; private set; } 
    public Rectangle ClientRect { get; private set; } 
    public Rectangle ScreenPos { get; private set; } 

    public ProcessSpyData(IntPtr windowHandle) 
    { 
     this.WindowHandle = windowHandle; 
     GetWindowText(); 
     GetWindowSize(); 
    } 

    private void GetWindowText() 
    { 
     StringBuilder message = new StringBuilder(1024); 
     SendMessage(this.WindowHandle, WM_GETTEXT, message.Capacity, message); 
     this.WindowText = message.ToString(); 
    } 

    private void GetWindowSize() 
    { 
     var nativeRect = new RECT(); 
     GetClientRect(this.WindowHandle, out nativeRect); 
     this.ClientRect = nativeRect.ToRectangle(); 

     Point loc = this.ClientRect.Location; 
     ClientToScreen(this.WindowHandle, ref loc); 
     this.ScreenPos = new Rectangle(loc, this.ClientRect.Size); 
    } 
    } 

あなたが始める必要があることが、アプリが非標準コントロールを使用している場合は注意する必要がありこの方法でテキストを取り出す方法と、画像の場合は、実行可能なリソースを見てより良い結果が得られるかもしれません。各種制御タイプのため

UPDATE

Getingコントロールのテキスト(MFC、WinFormsのは、デルファイVCLなど)は非常に難しい作業になるだろうが、リサイズが優秀Managed Windows APIを見るために、彼らも、スパイアプリケーションのいくつかの並べ替えでを持っていますtools、それを見てください。

+0

素敵な答えをありがとう。私はトップから始めています...テキストで位置を制御できる関数の名前は何ですか(ボタンと言う)。 user32.dllの中に何か?私は私の窓についた。今私はコントロールを見つける必要があります。 – user194076

+0

ウィンドウはコントロールです:) Windowsでは、コントロールはありません。コントロールは通常、多くのウィンドウから構築されています。 IMOコントロールコンテンツを取得するためのジェネリックメソッドを作成することはほとんど不可能です。Winformsコントロールのコンテンツを取得するにはhttp://mwinapi.sourceforge.net/を参照してください。 –

6

私はあなたが使用することをお勧め涼しいが、この作品のためにUI Automation APIをあまり知られていません。

このため、最初にテストするのは、関連するUISpyツールを起動することです。アクセス可能なすべてのウィンドウのツリーが画面に表示されます。また、メニューを押す、項目を選択するなどのいくつかのアクションを実行することもできます。これは、UI Automation Control Patternsという名前のものを使用しています。これは、コントロールの種類やコントロールの外観に関係なく、コントロールの機能を分類して公開する方法を提供します。

したがって、UI Spyでこのアプリケーションを自動化できる場合は、.NETコードを使用して同じことを行うこともできます(UISpy自体は基本APIを使用しています)。ここで

は、UI自動化プログラミングについて興味深いチュートリアルの記事です:あなたが点検したいアプリケーションを注入するより他に方法はThe Microsoft UI Automation Library

0

はありません。これがUISpyが実際にどのように動作するかです。このため、UISpyを管理者資格で実行する必要があります。

関連する問題