當我們需要透過程式去操作"另外一個程式"的功能,例如將記事本中寫入一些文字,這時候就可以利用FindWindow取得主操作視窗,再透過FindWindowEx來取得編輯框的window handle 操作的功能,最後透過SendMessage將訊息送到目標中的編輯區即可達到我們期望的效果。
關鍵的三個API
IntPtr MainWnd = FindWindow(“Notepad", null);
IntPtr ChildWnd = FindWindowEx(MainWnd, IntPtr.Zero, “Edit", “"); SendMessage(ChildWnd, WM_SETTEXT, 0, InsStr);
FindWindow 中的 “Notepad" 與 FindWindowEx中的 “Edit" 是要透過 SPY++ 看class名稱後,填入參數中
API 參數的查詢
關於FindWindow、FindWindowEx、SendMessage其他參數的說明,可以從網址查詢,這裡提供不錯的 API 查詢功能
http://tlcheng.twbbs.org/TLCheng/WinAPI/winapi.asp
找到 FindWindow 中的 “Notepad"
開啟 SPY++ 從 View -> Find Windows -> 點 Hide Spy ++ ->將游標點到 Notepad 上就可以得到 Class 名稱
找到 FindWindowEx “Edit"
方法同上,只是要將游標點到編輯區,即可得到
將文字送到notepad 中的 edit
const int WM_SETTEXT = 0x000C; //發送此訊息設置一個視窗的文字
SendMessage(ChildWnd, WM_SETTEXT, 0, InsStr);
以上就可以達成操作另外一應用程式的功能,以下為完整的 Smaple Code 提供參考
Sample Code
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace ConsoleApplication1 { class Program { [DllImport("user32.dll", SetLastError = true)] static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr FindWindowEx(IntPtr hwndParent,IntPtr hwndChildAfter, string lpszClass, string lpszWindow); [DllImport("user32.dll", SetLastError = true)] static extern int SendMessage(IntPtr hWnd, int msg, int wParam, StringBuilder lParam); const int WM_SETTEXT = 0x000C; static void Main(string[] args) { IntPtr MainWnd = FindWindow("Notepad", null); IntPtr ChildWnd = FindWindowEx(MainWnd, IntPtr.Zero, "Edit", ""); StringBuilder InsStr = new StringBuilder(); InsStr.Append("ABCDEFGHIJK565465465"); SendMessage(ChildWnd, WM_SETTEXT, 0, InsStr); } } }
Result
於記事本出現 ABCDEFGHIJK565465465 文字