qt当通过子进程的方式嵌入窗口后,键盘按键响应不了怎么办?

案例问题:当通过QProcess类,创建了一个子线程后,再将该子线程中的窗口封装到QWidget后嵌入当前主窗口中后,当在操作主进程窗口后,再去操作子进程窗口时,这时出现子进程窗口无法获取到键盘消息。或者先操作子进程中的窗口后,再切换到主进程窗口中的编辑框也会失去键盘消息。

分析:当在主进程中操作编辑框后,会将键盘事件捕获,而这时候去操作子进程的编辑框时,这个键盘事件已经被主进程独占了!也就导致了键盘失效。那能不能用释放键盘事件去实现了,经测试也不行。只在同一个进程中时有效。在不同进程中这种方式不行。

解决方案:

通过将主进程窗口在切换到子进程窗口时,通过进程间通讯的方式,告诉子进程,让子进程自己将自己的窗口做再次激活处理。来保证当子进程窗口进入后处于激活状态。这样自然而然键盘事件就能响应了。当从子进程窗口切换到主进程中时,也通过类似的方式来操作。

但是当在操作子进程窗口时,同时还需要操作主进程中的一些快捷方式时(比如F1-F12按键),就需要通过系统级别的消息事件,在window下,采用window的hook的方式捕获键盘事件,然后在封装为键盘事件发送到主进程中。因为在qt的工作机制下,当应用处于失去焦点的状态时,键盘事件是失效的。通过注册键盘事件,及过滤器是无法捕抓到键盘事件的。所以只能采用系统级别的hook方式。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中,可以使用QProcess进行子进程的创建和管理。然而,QProcess本身并不提供获取窗口句柄的功能。要获取子进程窗口句柄,可以借助一些底层操作系统的API。 首先,在Qt中启动子进程之后,可以使用QProcess的pid()函数获取子进程的进程ID。然后,可以使用操作系统相关的API来获取子进程窗口句柄。以下以Windows操作系统为例,介绍如何实现: 1. 使用QProcess启动子进程。 ``` QProcess process; process.start("your_executable_file"); ``` 2. 获取子进程的进程ID。 ``` qint64 pid = process.pid(); ``` 3. 使用Windows API函数EnumWindows()遍历所有顶级窗口,并查找与子进程进程ID对应的窗口。 ```cpp #include <windows.h> HWND childWindow = nullptr; BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { DWORD pid; GetWindowThreadProcessId(hwnd, &pid); if (pid == static_cast<DWORD>(lParam)) { childWindow = hwnd; return FALSE; // 找到目标窗口后,终止遍历 } return TRUE; } EnumWindows(EnumWindowsProc, static_cast<LPARAM>(pid)); ``` 4. 最后,可以使用获取到的窗口句柄进行后续操作,例如设置窗口属性、发送消息等。 ```cpp // 设置窗口标题 QString title = "New Window Title"; SetWindowText(childWindow, title.toStdWString().c_str()); // 发送消息到子进程窗口 std::wstring message = L"Hello from Parent"; SendMessage(childWindow, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(message.c_str())); ``` 需要注意的是,获取窗口句柄是操作系统相关的操作,不同平台可能有不同的实现方式。因此,上述代码只适用于Windows平台。在其他平台上,可能需要使用不同的API函数或方法来获取窗口句柄。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值