【问题标题】:Win32 - how I can enter the text into an any window programmatically?Win32 - 如何以编程方式将文本输入任何窗口?
【发布时间】:2014-09-15 06:03:23
【问题描述】:

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

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

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);
   }

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

【问题讨论】:

  • 查看SendInput函数。

标签: windows winapi textbox focus


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多