日期:2014-05-18 浏览次数:21141 次
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using System.Diagnostics; using System.Threading; namespace ConsoleApplication1 { class Program { [DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)] static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", EntryPoint = "FindWindowEx", CharSet = CharSet.Auto)] extern static IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam); [STAThread] static void Main(string[] args) { string path = "C:\\WINDOWS\\system32\\calc.exe"; Process p = Process.Start(path); if (p == null) Console.WriteLine("Warning:process may already exist"); Console.WriteLine("Finding main window handle"); IntPtr mainWindows = FindMainWindowHandle("计算器", 100, 25); Console.WriteLine("Handle to main window is " + mainWindows); //有名字控件句柄 Console.WriteLine("Findding handle to button1"); IntPtr butt = FindWindowEx(mainWindows, IntPtr.Zero, null, "Backspace");//这里的1是,计算器上名字为1的按钮 if (butt == IntPtr.Zero) throw new Exception("Unable to find button1"); else Console.WriteLine("Handle to button1 is " + butt); SendMessage(mainWindows, 0X101, butt, null); //没有名字或者重名控件 //Console.WriteLine("Findding handle to listbox1"); //IntPtr lb = FindWindowByIndex(mwh, 3); //if (lb == IntPtr.Zero) // throw new Exception("Unable to find listbox1"); //else // Console.WriteLine("Handle to listbox1 is " + lb); } //通过索引查找相应控件句柄 static IntPtr FindWindowByIndex(IntPtr hwndParent, int index) { if (index == 0) { return hwndParent; } else { int ct = 0; IntPtr result = IntPtr.Zero; do { result = FindWindowEx(hwndParent, result, null, null); if (result != IntPtr.Zero) { ++ct; } } while (ct < index && result != IntPtr.Zero); return result; } } //获得待测程序主窗体句柄 private static IntPtr FindMainWindowHandle(string caption, int delay, int maxTries) { IntPtr mwh = IntPtr.Zero; bool formFound = false; int attempts = 0; while (!formFound && attempts < maxTries) { if (mwh == IntPtr.Zero) { Console.WriteLine("Form not yet found"); Thread.Sleep(delay); ++attempts; mwh = FindWindow(null, caption); } else { Console.WriteLine("Form has been found"); formFound = true; } } if (mwh == IntPtr.Zero) throw new Exception("Could not find main window"); else return mwh; } } }<