Win32 - 如何以编程方式将文本输入任何窗口?

时间:2014-09-08 23:05:45

标签: windows winapi textbox focus

我有一个应用程序,它在后台运行(停留在Windows托盘区域),我需要将键击(通常是纯文本)发送到前台应用程序,无论是普通应用程序还是Qt应用程序,或者它是其他一些应用程序。我怎样才能使用Win API?

我的代码适用于MSVC代码编辑窗口,适用于记事本,适用于Wotdpad,适用于MS Word / Excel,但不适用于Qt Creator,Google Chrome和远程文件管理器。

HWND hwndActiveWindow = GetForegroundWindow();
if (hwndActiveWindow==0) 
   {
    return;
   }

DWORD activeWndProcessId = 0, activeWndThreadId = ::GetWindowThreadProcessId( hwndActiveWindow, &activeWndProcessId );

GUITHREADINFO gti = { sizeof(gti) };
if (!GetGUIThreadInfo( activeWndThreadId, &gti ))
   {
    return;
   }

if (gti.hwndCaret==0)
   {
    return;
   }

::std::wstring::size_type i = 0, size = str.size();
for(; i!=size; ++i)
   {
    ::PostMessage( gti.hwndCaret, WM_CHAR, (WPARAM)str[i], 1);
   }

无论用于应用程序的技术/框架如何,我都需要它在任何地方工作。我想我可以使用剪贴板,但这不是一个很好的解决方案。

1 个答案:

答案 0 :(得分:0)

使用INPUT_KEYBOARD和KEYEVENTF_UNICODE的SendInput解决了这个问题。

关于Qt的注意事项:对于Qt应用程序,它需要发送输入事件两次 - 首先是按键,第二次是按键释放(使用KEYEVENTF_KEYUP标志)。对于所有其他应用程序,它只需要发送按键事件,但我认为发送两个关键事件更正确。