白草遥遥 2022-11-01 00:56 采纳率: 100%
浏览 100
已结题

Qt| 如何将QString字符串输出到外部程序的文本框?

在写一个类似于剪切板的程序,想要将QString字符串直接输出到外部程序的文本框,是外部程序!比如word文档、浏览器地址栏。
不要使用QCilpboard
不要使用QCilpboard

img

然后现在有两个问题,
一个是点击程序时,鼠标焦点会转移到程序身上,如何保证鼠标焦点不转移?(设置焦点策略没有用)

另一个是QString字符串如何输出到外部程序的文本框?

查询了很多资料无果,渴望有朋友能解答,感谢!

  • 写回答

5条回答 默认 最新

  • churuxu 2022-11-01 09:46
    关注

    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;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 11月10日
  • 已采纳回答 11月2日
  • 创建了问题 11月1日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来