获取活动窗口文本(并向其发送更多文本)

我在C#中创建一个小实用程序,当按下全局热键时,它会向活动文本框添加一些文本,这是一种自动完成function。 我有我的全局热键,但现在我不知道如何在活动文本框中获取当前文本(如果活动窗口是一个文本框)。到目前为止我尝试过的是使用

一个。 GetForegroundWindow然后使用该句柄调用GetWindowText。 这给了我活动窗口的窗口标题,而不是文本框内容。

湾 GetActiveWindow并使用该句柄调用GetWindowText。 这根本不给我任何文字。

这是我所做的一个例子

[DllImport("user32.dll")] private static extern bool UnregisterHotKey(IntPtr hWnd, int id); [ DllImport("user32.dll") ] static extern int GetForegroundWindow(); [ DllImport("user32.dll") ] static extern int GetWindowText(int hWnd, StringBuilder text, int count); [DllImport("user32.dll")] static extern int GetActiveWindow(); public static void TestA() { int h = GetForegroundWindow(); StringBuilder b = new StringBuilder(); GetWindowText(h, b, 256); MessageBox.Show(b.ToString()); } public static void TestB() { int h = GetActiveWindow(); StringBuilder b = new StringBuilder(); GetWindowText(h, b, 256); MessageBox.Show(b.ToString()); } 

那么,关于如何实现这一点的任何想法?

编辑28.01.2009:所以,我发现了如何做到这一点。 这是我用过的:

 using System; using System.Text; using System.Runtime.InteropServices; public class Example { [DllImport("user32.dll")] static extern int GetFocus(); [DllImport("user32.dll")] static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach); [DllImport("kernel32.dll")] static extern uint GetCurrentThreadId(); [DllImport("user32.dll")] static extern uint GetWindowThreadProcessId(int hWnd, int ProcessId); [DllImport("user32.dll") ] static extern int GetForegroundWindow(); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] static extern int SendMessage(int hWnd, int Msg, int wParam, StringBuilder lParam); const int WM_SETTEXT = 12; const int WM_GETTEXT = 13; public static void Main() { //Wait 5 seconds to give us a chance to give focus to some edit window, //notepad for example System.Threading.Thread.Sleep(5000); StringBuilder builder = new StringBuilder(500); int foregroundWindowHandle = GetForegroundWindow(); uint remoteThreadId = GetWindowThreadProcessId(foregroundWindowHandle, 0); uint currentThreadId = GetCurrentThreadId(); //AttachTrheadInput is needed so we can get the handle of a focused window in another app AttachThreadInput(remoteThreadId, currentThreadId, true); //Get the handle of a focused window int focused = GetFocus(); //Now detach since we got the focused handle AttachThreadInput(remoteThreadId, currentThreadId, false); //Get the text from the active window into the stringbuilder SendMessage(focused, WM_GETTEXT, builder.Capacity, builder); Console.WriteLine("Text in active window was " + builder); builder.Append(" Extra text"); //Change the text in the active window SendMessage(focused, WM_SETTEXT, 0, builder); Console.ReadKey(); } } 

关于此的一些注意事项 该示例在执行任何操作之前等待5秒,使您有机会将焦点放在某个编辑窗口上。 在我的真实应用程序中,我使用热键来触发这个,但这只会混淆这个例子。 此外,在生产代码中,您应该检查win32调用的返回值,以查看它们是否成功。

如果您知道活动窗口和聚焦输入字段,则发送击键是合理的。 有关API,请参见http://www.pinvoke.net/default.aspx/user32/keybd_event.html 。

请检查,即使em_replacesel消息可能无法在不同的进程中工作,您可能需要使用WM_COPYDATA或通过调用url中给出的窗口过程,

http://www.microsoft.com/communities/newsgroups/en-us/default.aspx?dg=microsoft.public.smartphone.developer&tid=4e3a9289-9355-4af7-a5b9-84f1aa601441&cat=&lang=&cr=&sloc=en-我们&p = 1