2011-12-30 16 views
2

findwindowprocessで試しましたが、うまくいかなかったのですが、どのように特定のボタンを見つけることができますか?別のプログラムから別のウィンドウを読む方法

たとえば、ボタンクラスAfxWnd90uinstance 21があります。このボタンが表示されているかどうか確認したい私はこのコードで試してみましたが、ボタンを見つけることができませんでした。私はインスタンスと間違えたと思う。

少し実験したので、ここではfindwindowを使用しませんでした。

//////IMPORTANT///////////// 
System.Diagnostics.Process[] move = System.Diagnostics.Process.GetProcessesByName("PartyGaming"); 
ArrayList save = new ArrayList(); 
RECT rct = new RECT(); 
listBox1.Items.Add(move.Length); 
List<System.Diagnostics.Process> process = new List<System.Diagnostics.Process>(); 

// use only the process with the button AfxWnd90u21 
for (int i = 0; i < move.Length;++i) 
{ 
    IntPtr hCheck = FindWindowEx(move[i].MainWindowHandle, IntPtr.Zero, "AfxWnd90u21", null); 
    //if button is visible 
    if (hCheck != IntPtr.Zero) 
     process.Add(move[i]); 

    //////IMPORTANT///////////// 
} 
+3

+1はランダム-1をオフセットします。 –

+2

一般的に「ウィンドウスパイ」と呼ばれるものが必要なようです。ここに役立つかもしれないcodeprojectプロジェクトです:http://www.codeproject.com/KB/dotnet/wfspy.aspx –

+1

私は、複数のウィンドウに対応するためにサンプルを少し編集しました。最後にソートを追加しました。 – sarme

答えて

7

私はFindWindowとSendMessage Windows API関数を組み合わせることで、あなたが望むことができると信じています。面倒なことは、ウィンドウクラスの名前を発見することですが、WinSpy ++のようなものがあなたに役立つでしょう。

ここでは、APIの使用方法のサンプルを示します。 Notepad.exeを何度か開いて、テキストを入力してこのサンプルを実行します。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.InteropServices; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<WinText> windows = new List<WinText>(); 

      //find the "first" window 
      IntPtr hWnd = FindWindow("notepad", null); 

      while (hWnd != IntPtr.Zero) 
      { 
       //find the control window that has the text 
       IntPtr hEdit = FindWindowEx(hWnd, IntPtr.Zero, "edit", null); 

       //initialize the buffer. using a StringBuilder here 
       System.Text.StringBuilder sb = new System.Text.StringBuilder(255); // or length from call with GETTEXTLENGTH 

       //get the text from the child control 
       int RetVal = SendMessage(hEdit, WM_GETTEXT, sb.Capacity, sb); 

       windows.Add(new WinText() { hWnd = hWnd, Text = sb.ToString() }); 

       //find the next window 
       hWnd = FindWindowEx(IntPtr.Zero, hWnd, "notepad", null); 
      } 

      //do something clever 
      windows.OrderBy(x => x.Text).ToList().ForEach(y => Console.Write("{0} = {1}\n", y.hWnd, y.Text)); 

      Console.Write("\n\nFound {0} window(s).", windows.Count); 
      Console.ReadKey(); 
     } 

     private struct WinText 
     { 
      public IntPtr hWnd; 
      public string Text; 
     } 

     const int WM_GETTEXT = 0x0D; 
     const int WM_GETTEXTLENGTH = 0x0E; 

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

     [DllImport("user32.dll", SetLastError = true)] 
     public static extern int SendMessage(IntPtr hWnd, int msg, int Param, System.Text.StringBuilder text); 

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

    } 
} 
+0

うわー..大丈夫、これは最高です。私はnullポインタを見つけるまで反復するアイデアは決してありませんでした。どうもありがとうございます。 –

+1

問題ありません。喜んで助けてください。答えを受け入れることを忘れないでください。 – sarme

+0

私は最後の問題が1つあります。私は上記の投稿を編集しました。 –

関連する問題