生活随笔
收集整理的這篇文章主要介紹了
C# 实现模拟输入
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
前段時間由于要為公司的項目做輔助程序,然后通過C# 研究了以下智能輸入這個功能。
前提:
????我們是做模擬輸入的,所以需要知道用戶是如何操作這個程序的,了解用戶是如何操作我們就可以模擬用的行為對某個應用進行操作。
模擬輸入使用的關鍵技術:
????1.FindWindow和FindWindowEx【獲取窗口句柄】 2.SendMessage【發送指令信息】 3.SendKeys.Send()【模擬用戶的操作】
技術講解:
????函數:HWND?FindWindow(string strclassName, string strWindowName);
????這個函數有兩個參數,第一個要找的窗口的類,第二個是要找的窗口的標題。在搜索的時候不一定兩者都知道,但至少要知道其中的一個。如果打開的文件不同,窗口標題也不同,這時使用窗口類搜索就比較方便。
????返回值 如果函數成功,返回值為具體指定類名或者窗口句柄;如果函數失敗返回值為null;
????2.函數原型:HWND FindWindowEx(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR lpszWindow);
? 第一個參數:hwndParent為要找子窗口的父窗口句柄。第二參數:可以使用news Intpr.zero 獲取第一個或者直接 new intpr();第三個函數為要查找的子窗口的控件類型,第四個參數為要查找的子窗口中text的值。【這四個參數之間是 && 的關系】
? 3.函數原型?int SendMessage(IntPtr hWnd,int Msg, IntPtr wParam, string lParam);
????第一個參數為該控件的句柄,第二個參數為需要傳遞的指令,第三個參數可以為空,第二個參數為發送的內容。這個具體的指令可以參考:https://msdn.microsoft.com/en-us/library/ms646360(v=vs.85).aspx
????4.SendKeys.Send("");?
過程:
????第一步 引入這system32 的 類庫
??[DllImport("user32.dll")]public?static?extern?IntPtr?FindWindow(string?strclassName,?string?strWindowName);[DllImportAttribute("user32.dll")]//public?static?extern?string?SendMessage(IntPtr?hWnd,?int?Msg,?string?wParam,?string?lParam);private?static?extern?int?SendMessage(IntPtr?hWnd,int?Msg,?IntPtr?wParam,?string?lParam);?[DllImport("user32.dll",?EntryPoint?=?"FindWindowEx")]private?extern?static?IntPtr?FindWindowEx(IntPtr?parnet,?IntPtr?child,?string?strclaa,?string?FrmText);
?第二步獲取我需要操作的那個程序:
Process[]?processes?=?Process.GetProcessesByName("WindowsFormsApplication3.vshost");LogHelper.WriteLog(typeof(Form1),?"獲取進程句柄");if?(processes.Length?>?0){IntPtr?hWnd?=?processes[0].MainWindowHandle;?SetForegroundWindow(hWnd);//激活該線程,并將該程序置頂//獲取所有子類的類名List<IntPtr>?list?=?GetChildHandles(hWnd,?null);List<string>?strList?=?new?List<string>();foreach?(IntPtr?intp?in?list){StringBuilder?className?=?new?StringBuilder(256);GetClassName(intp,?className,?className.Capacity);if?(className.ToString().Contains("EDIT")?){//遍歷?找到input文本框的?ClassstrList.Add(className.ToString());}}//根據句柄向其他文本框發送消息IntPtr?childHWnd?=?FindWindowEx(hWnd,?new?IntPtr(),?strList[0],?null);LogHelper.WriteLog(typeof(Form1),?"文本框Class__"+strList[0]);//SendMessage(childHWnd,?WM_SETTEXT,?(IntPtr)0,?"hashi");//根據句柄向其他文本框發送消息?end
????第三步 獲得需要輸入的數據源。
????第四步 模擬用戶輸入。
foreach?(string?value?in?decHead)?{if?(null?==?value?||?value.Length?<?1){SendKeys.Send("{ENTER}");}else{SendKeys.Send(value);//模擬鍵盤輸入值SendKeys.Send("{ENTER}");//模擬鍵盤輸入回車鍵}}
具體代碼請見 git:http://git.oschina.net/scc/AnalogInput
轉載于:https://my.oschina.net/shichangcheng/blog/391991
總結
以上是生活随笔為你收集整理的C# 实现模拟输入的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。