在写一个类似于剪切板的程序,想要将QString字符串直接输出到外部程序的文本框,是外部程序!比如word文档、浏览器地址栏。
不要使用QCilpboard
不要使用QCilpboard
然后现在有两个问题,
一个是点击程序时,鼠标焦点会转移到程序身上,如何保证鼠标焦点不转移?(设置焦点策略没有用)
另一个是QString字符串如何输出到外部程序的文本框?
查询了很多资料无果,渴望有朋友能解答,感谢!
在写一个类似于剪切板的程序,想要将QString字符串直接输出到外部程序的文本框,是外部程序!比如word文档、浏览器地址栏。
不要使用QCilpboard
不要使用QCilpboard
然后现在有两个问题,
一个是点击程序时,鼠标焦点会转移到程序身上,如何保证鼠标焦点不转移?(设置焦点策略没有用)
另一个是QString字符串如何输出到外部程序的文本框?
查询了很多资料无果,渴望有朋友能解答,感谢!
QT中取得HWND可以通过 xxx.winId() 获取
通过 Windows API 设置窗口不占用焦点
SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_NOACTIVATE);
往其他程序输入文字,就通过SendInput发送一个或多个按键事件
https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendinput
基于Windows API开发的完整Demo:
/*屏幕键盘原理Demo
窗口置顶、不占用焦点
点击此窗口,往当前焦点程序的文本框中输入内容
*/
#include <windows.h>
//生成键盘输入文字事件
VOID SendInputText(LPCTSTR str){
int len = lstrlen(str);
INPUT* inputs = (INPUT*)LocalAlloc(LMEM_FIXED|LMEM_ZEROINIT, len*sizeof(INPUT));
for (int i = 0; i < len; i++){
inputs[i].type = INPUT_KEYBOARD;
inputs[i].ki.dwFlags = KEYEVENTF_UNICODE;
inputs[i].ki.wScan = str[i];
}
SendInput(len, inputs, sizeof(INPUT));
LocalFree(inputs);
}
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
switch (message){
case WM_LBUTTONUP:
SendInputText(TEXT("Hello World")); //产生键盘输入 Hello World 事件
return 1;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 1;
}
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR lpCmdLine,int nCmdShow){
WNDCLASS wc = {0};
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpfnWndProc = MainWndProc;
wc.hInstance = hInst;
wc.lpszClassName = TEXT("MainWindowClass");
RegisterClass(&wc);
HWND hwnd = CreateWindow(TEXT("MainWindowClass"), TEXT("Virtual Keyboard Demo"),
(WS_OVERLAPPED|WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU),
CW_USEDEFAULT,CW_USEDEFAULT,350,200,NULL,NULL,hInst,NULL);
//设置窗口置顶
SetWindowPos(hwnd, HWND_TOPMOST, 0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
//设置窗口不会取得焦点
SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_NOACTIVATE);
ShowWindow(hwnd, SW_SHOWNOACTIVATE);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}