我有一个应用程序,它在后台运行(停留在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, >i ))
{
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);
}
无论用于应用程序的技术/框架如何,我都需要它在任何地方工作。我想我可以使用剪贴板,但这不是一个很好的解决方案。
答案 0 :(得分:0)
使用INPUT_KEYBOARD和KEYEVENTF_UNICODE的SendInput解决了这个问题。
关于Qt的注意事项:对于Qt应用程序,它需要发送输入事件两次 - 首先是按键,第二次是按键释放(使用KEYEVENTF_KEYUP标志)。对于所有其他应用程序,它只需要发送按键事件,但我认为发送两个关键事件更正确。