2012-05-08 131 views
1

我在C#中玩耍,并希望我的小控制台程序在我已打开的记事本窗口中拼写我的名字。我有窗口句柄(IntPtr),但不知道从这里做什么。如何发送keytype到记事本?

我可以使用SendKey,但我想它的时候已经记事本或重点不工作,我的理解,如果你有在窗口集中它Senkey只工作:(

编辑: 我已经尝试下面的(试图模拟按B):

PostMessage(NotepadWindowHandle, 0x100, 0x42, 0); 
Thread.Sleep(1000); 
PostMessage(NotepadWindowHandle, 0x101, 0x42, 0); 

什么也没有发生:(而且它不会破坏

+0

您还可以看看这篇文章: http://stackoverflow.com/questions/1922707/setting-external-application-focus它的VB,但应该帮助。 –

回答

2

你是正确的,SendKey仅适用于焦点编辑窗口。

你想要做的是P/Invoke SendMessage并发送WM_SETTEXT文本框的句柄(请注意,这不是主窗口句柄!)。为了得到它,你可以向下浏览窗口层次结构,直到到达GetWindow

作为免费赠品,要获得文本框的句柄,只需在您的主记事本窗口句柄上拨打GetWindowGW_CHILD即可获得它,它实际上是第一个孩子。

+0

虽然请注意,这不*输入*文字。它只适用于理解WM_SETTEXT的窗口。 –

+0

记事本窗口在做什么。 – Blindy

+0

...这是记事本窗口所做的。因为它是一个编辑控件。我相信RichText窗口可以工作,所以写字板也可以。我只是指出它不会输入文本,所以它可能不适用于其他文本输入字段。 –

0

如果你有记事本的窗口句柄,为什么不先把它作为前景窗口激活,然后然后发出你的SendKey

这是的P/Invoke签名设置窗口前台窗口:

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool SetForegroundWindow(IntPtr hWnd); 

编辑:前回答了类似的问题:https://stackoverflow.com/a/8953524/1149773