C# Win32 API FindWindow/ FindWindowEx/SendMessage

當我們需要透過程式去操作"另外一個程式"的功能,例如將記事本中寫入一些文字,這時候就可以利用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 名稱

20170904_01_notespad_spy1

找到 FindWindowEx “Edit"

方法同上,只是要將游標點到編輯區,即可得到

20170904_01_notespad_spy2

將文字送到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 文字

20170904_01_notespad

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s