作者cole945 (躂躂..)
看板C_Sharp
标题Re: [问题] 有办法做到将字串输入到其他程式吗?
时间Sat May 26 16:45:16 2007
※ 引述《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
1F:推 LCDbest:大大你太利害了XDD 小弟拜读一下~@@~ 05/26 20:33
2F:推 holybible:一个完整的 win32 <-> .NET 范例,值得推荐! 05/29 00:55