Re: [問題] 有辦法做到將字串輸入到其他程式嗎?
※ 引述《LCDbest (怒!恨!殺!吼吼吼~~)》之銘言:
: 請問各位前輩們....
: 想請問一下.
: 有辦法寫一個程式 此程式內容為 "將此程式輸入的字串 輸入到記事本"
: 例如: 這個程式有一個TextBox 和一個Button,在TextBox輸入的字串
: 按下Button後,可以將在TextBox裡面的字串,直接輸出至記事本的
: 編輯框裡.
: ( 不是輸出成一個txt喔,而是輸出至記事本的編輯框裡 <--假設只開一個記事本 )
: 有辦法做到嗎@@??....
: 謝謝
.NET 本身無法這樣做, 這要用 p/invoke呼叫windows api來做WM_CHAR訊息
(模擬按鍵盤輸入)
以notepad為例,
1. 先用 Visual Studio附的 Spy++工具去看notepad編輯框的資訊
會發現他們是
class: "Notepad" Window: "Untitled - Notepad"
└ class: "Edit" Window: ""
要知道這個資訊是因為要取得編輯框的window handle並送訊息過去
2. 用FindWindow與FindWindowEx來取得編輯框的window handle
(該怎麼在C#宣告使用windows api, 請到 http://www.pinvoke.net/ 去查)
IntPtr npWnd = FindWindow("Notepad", null);
IntPtr editWnd = FindWindowEx(npWnd, IntPtr.Zero, "Edit", IntPtr.Zero);
黃色部份是用Spy++看來的class名稱, 因為他們編輯框是隸屬於Notepad下面,
所以第二次要用 FindWindowEx ..
3. 接著用 SendMessage 以 WM_CHAR 的方式, 把字元一個一個送過去..
for(int i=0; i<textBox1.Text.Length; i++)
SendMessage(
editWnd, // 用FindWindow找出的window handle
0x0102, // 這個值代表 WM_CHAR 訊息
TextBox1.Text[i], // 要被送過去的字元
0 );
完整程式如下..
[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", CharSet = CharSet.Auto)]
static extern uint SendMessage(IntPtr hWnd, int Msg,
int wParam, int lParam);
private void button1_Click_1(object sender, EventArgs e)
{
IntPtr npWnd = FindWindow("Notepad", null);
IntPtr editWnd = FindWindowEx(npWnd, IntPtr.Zero, "Edit", IntPtr.Zero);
for(int i=0;i<textBox1.Text.Length;i++)
Win32.User32.User32API.SendMessage(
editWnd, 0x0102, (in)textBox1.Text[i], 0);
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.139.143.230
推
05/26 20:33, , 1F
05/26 20:33, 1F
推
05/29 00:55, , 2F
05/29 00:55, 2F
討論串 (同標題文章)
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章