需求是這樣,有個程序界面咱們須要經過本身的程序持續輸入數據,界面如圖。c#
能夠得到控件的句柄而用鉤子寫入值。這裏須要用到spy++工具。在VS的工具下有個spy++工具,打開以下圖工具
經過這個工具能夠得到窗體的句柄,固然這裏得到的句柄只能用於測試,由於.net開發的程序窗體每次打開句柄都會變,都須要從新得到。這個工具的用處在於找一個控件的前一句柄控件和後一句柄控件。測試
//尋找目標進程窗口 [DllImport("USER32.DLL")] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("USER32.DLL", EntryPoint = "FindWindowEx", SetLastError = true)] public static extern IntPtr FindWindowEx(IntPtr hwndParent, uint hwndChildAfter,string lpszClass, string lpszWindow); //設置進程窗口到最前 [DllImport("USER32.DLL")] public static extern bool SetForegroundWindow(IntPtr hWnd); //模擬鍵盤事件 [DllImport("USER32.DLL")] public static extern void keybd_event(Byte bVk, Byte bScan, Int32 dwFlags, Int32 dwExtraInfo); public delegate bool CallBack(IntPtr hwnd, int lParam); [DllImport("USER32.DLL")] public static extern int EnumChildWindows(IntPtr hWndParent, CallBack lpfn, int lParam); //給CheckBox發送信息 [DllImport("USER32.DLL", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)] public static extern int SendMessage(IntPtr hwnd, UInt32 wMsg, int wParam, int lParam); //給Text發送信息 [DllImport("USER32.DLL", EntryPoint = "SendMessage")] private static extern int SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, string lParam); [DllImport("USER32.DLL")] public static extern IntPtr GetWindow(IntPtr hWnd, int wCmd);
/// <summary> /// 查找窗體上控件句柄 /// </summary> /// <param name="hwnd">父窗體句柄</param> /// <param name="lpszWindow">控件標題(Text)</param> /// <param name="bChild">設定是否在子窗體中查找</param> /// <returns>控件句柄,沒找到返回IntPtr.Zero</returns> private static IntPtr FindWindowEx(IntPtr hwnd, string lpszWindow, bool bChild) { IntPtr iResult = IntPtr.Zero; // 首先在父窗體上查找控件 iResult = FindWindowEx(hwnd, 0, null, lpszWindow); // 若是找到直接返回控件句柄 if (iResult != IntPtr.Zero) return iResult; // 若是設定了不在子窗體中查找 if (!bChild) return iResult; // 枚舉子窗體,查找控件句柄 int i = EnumChildWindows( hwnd, (h, l) => { IntPtr f1 = FindWindowEx(h, 0, null, lpszWindow); if (f1 == IntPtr.Zero) return true; else { iResult = f1; return false; } }, 0); // 返回查找結果 return iResult; } /// <summary> /// 輸入回車 /// </summary> private static void PrintEnter() { keybd_event(Convert.ToByte(13), 0, 0, 0); keybd_event(Convert.ToByte(13), 0, 2, 0); }
IntPtr wcHandle = FindWindow(null, "窗體名稱"); if (wcHandle != IntPtr.Zero) { //設置遊戲窗口到最前 SetForegroundWindow(wcHandle); }
uint BM_GETCHECK = 0xF0; uint BST_CHECKED = 0xF1; IntPtr weightIntPtr = FindWindowEx(wcHandle, "輸入重量[&H]", true); if (weightIntPtr != IntPtr.Zero) { //得到Checkbox值 int i = SendMessage(weightIntPtr, BM_GETCHECK, 0, 0); //更改CheckBox值 SendMessage(weightIntPtr, BST_CHECKED, 1, 0); }
public enum WindowSearch { GW_HWNDFIRST = 0, //同級別第一個 GW_HWNDLAST = 1, //同級別最後一個 GW_HWNDNEXT = 2, //同級別下一個 GW_HWNDPREV = 3, //同級別上一個 GW_OWNER = 4, //屬主窗口 GW_CHILD = 5 //子窗口}獲取與指定窗口具備指定關係的窗口的句柄 } IntPtr waybill = GetWindow(waybillIntPtr, (int)WindowSearch.GW_HWNDNEXT); SendMessage(waybill, WM_SETTEXT, IntPtr.Zero, waybillValue);
這裏完成了咱們的需求,改變了窗體中選擇框和Text文本框的值。ui