目录

需求

有三个软件A、B、C。A是主要软件,B、C是辅助软件。

⑴ 在使用A的过程中,按N键可以呼出软件B,按M键可以呼出软件C。再次按下可以隐藏它们。

⑵ 在软件B、C都存在的条件下,按J键可以实现鼠标焦点以A->B->C的顺序在软件之间切换。

分析

需求(1)

在按键事件中对M或N键做处理,当对应键按下时,首先判断B.exe或C.exe是否存在,如果不存在则执行对应exe,否则显示或隐藏它们。这里不再赘述。

需求(2)

以从A切到B为例,由A通过UDP发消息给B,B收到消息后将焦点切到自身。其他类似。

定义通用变量

主要定义软件端口、消息类型、发送者类型。后面将建立三个Qt工程,MainDlg代表软件A,compass代表软件B,chatlist代表软件C。定义如下:

/*****************************************************

Author: 张志浩

Mail: 791745123@qq.com

Time: 2019-1-5

Function:

通用变量、宏定义头文件

DESTPORT : 目标主机端口

SENDERTYPE : 发送者类型

MSGTYPE : 消息类型

Version: v 1.0

*****************************************************/

#pragma once

typedef enum

{

PORT_MAINDLG = 8000,

PORT_COMPASS,

PORT_CHATLIST

}DESTPORT;

typedef enum

{

PROCESS_NONE = 100,

PROCESS_MAINDLG,

PROCESS_COMPASS,

PROCESS_CHATLIST

}SENDERTYPE;

typedef enum

{

MSG_NONE = 10,

MSG_CHANGEMOUSEPOS

}MSGTYPE;

设计通信报文

写一个报文基类,包含消息类型、发送者、附加消息三类信息。后期可以继承它来丰富信息种类。实现如下:

/*****************************************************

Author: 张志浩

Mail: 791745123@qq.com

Time: 2019-1-5

Function:

报文基类

Version: v 1.0

*****************************************************/

#pragma once

#include "commonType.h"

#include

#define BUFF_LENGTH 128

class CInfoBase

{

public:

CInfoBase():infoType(0), senderType(0)

{

memset(addMsg, 0, BUFF_LENGTH);

}

bool InputAddMsg(const char* buff, int length)

{

if (length < BUFF_LENGTH && length > 0)

{

memcpy(addMsg, buff, length);

return true;

}

return false;

}

public:

//消息类型

int infoType;

//发送者

int senderType;

//附加消息

char addMsg[BUFF_LENGTH];

};

焦点切换

焦点切换按以下几步进行:

//获取自身窗口句柄并置前

HWND hwnd = ::FindWindow(NULL, L"compass");

::SetForegroundWindow(hwnd);

//获取置前窗口句柄(该步骤可省略,直接用上一步获得的句柄)

HWND hForeWnd = ::GetForegroundWindow();

//获取当前工作线程ID

DWORD dcurid = ::GetCurrentThreadId();

//获取置前窗口的线程ID

DWORD dfoid = ::GetWindowThreadProcessId(hForeWnd, NULL);

//依附

::AttachThreadInput(dcurid, dfoid, TRUE);

//设置鼠标位置

QRect rect = this->geometry();

SetCursorPos(rect.left() + 200, rect.top() + 200);

依附的步骤是必要的,因为如果不依附,就算鼠标位置从A移到B了,此时的键盘输入焦点还在A。按J键只会进入A的键盘事件,除非手动点击一下B再按J。

整体流程梳理

以从MainDlg切往compass为例,此时三个软件都已经打开并显示在桌面。

1 按J键进入MainDlg键盘事件,发送消息到compass

void MainDlg::keyPressEvent(QKeyEvent * event)

{

switch(event->key())

{

case Qt::Key_J:

{

CInfoBase m_sendMsg;

m_sendMsg.infoType = MSG_CHANGEMOUSEPOS;

m_sendMsg.senderType = PROCESS_MAINDLG;

m_myudp.SendData((char*)&m_sendMsg, sizeof(m_sendMsg), PORT_COMPASS, "127.0.0.1");

break;

}

default:

{

}

}

}

2 compass收到UDP消息,切换焦点

void CUdpMsgBase::DataHanding(const char* data)

{

int msgType = MSG_NONE;

::memcpy(&msgType, data, sizeof(int));

if (msgType == MSG_NONE)

{

}

if (msgType == MSG_CHANGEMOUSEPOS)

{

emit changepos();

}

return;

}

进入槽函数

void MainDlg::changePos()

{

HWND hwnd = ::FindWindow(NULL, L"MainDlg");

::SetForegroundWindow(hwnd);

HWND hForeWnd = ::GetForegroundWindow();

DWORD dcurid = ::GetCurrentThreadId();

DWORD dfoid = ::GetWindowThreadProcessId(hForeWnd, NULL);

::AttachThreadInput(dcurid, dfoid, TRUE);

QRect rect = this->geometry();

SetCursorPos(rect.left() + 200, rect.top() + 200);

}

效果

总结

主要考察到对AttachThreadInput的运用,还有就是设计好三者之间切换的流程。即将焦点切换的动作交给目标进程来做,自身进程只负责发消息,避免逻辑混乱。

qt 进程间切换焦点_Qt下的进程界面之间的鼠标焦点切换相关推荐

  1. java进程间通讯方式有哪些_java 进程间通讯的有几种方法?

    展开全部 进程间通信的方法主要有以下几种: (1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另32313133353236313431303231363533e78988e6 ...

  2. linux进程和线程教程,Linux下查看进程和线程

    在Linux中查看线程数的三种方法 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行显示一个进程. 2.ps xH 手册 ...

  3. linux 进程间读写锁,Linux系统编程—进程间同步

    我们知道,线程间同步有多种方式,比如:信号量.互斥量.读写锁,等等.那进程间如何实现同步呢?本文介绍两种方式:互斥量和文件锁. ##互斥量mutex 我们已经知道了互斥量可以用于在线程间同步,但实际上 ...

  4. Linux进程列表巧用,Linux下的进程分析–PS

    当我们在 下要对进程进行监测和控制时,首先必须要了解当前进程的情况,也就是需要查看当前进程,ps 就是最基本进程查看 .今天小编就来带领大家一起学习 下分析进程的命令--PS. 1. ps是什么? 要 ...

  5. 查看linux进程的设备io,Linux下查看进程IO工具iopp

    Linux下的IO检测工具最常用的是iostat,不过iostat只能查看到总的IO情况.如果要细看具体那一个程序点用的IO较高,可以使用iotop .不过iotop对内核版本和Python版本有要求 ...

  6. 在Linux系统下实现进程,在Linux2.6内核下实现进程隐藏

    很早以前的小程序,比较简单但是觉得有趣 原理很简单,Linux查看进程的命令ps是通过系统调用sys_getdents实现,sys_getdents用户获取一个指定路径下的目录条目,实际上就是枚举 / ...

  7. linux进程间Socket速率,用socketpair()进行进程间的全双工通讯

    用socketpair()进行进程间的全双工通讯 /************************************************* *  description: use sock ...

  8. linux孤儿进程组深入理解,LInux下僵尸进程与孤儿进程是如何产生的?

    1:如何产生: 僵尸进程,先于父进程终止,但是父进程没有对其进行善后处理(获取终止子进程有关信息,释放它仍占有的资源).消灭僵尸进程的唯一方法是终止其父进程. 孤儿进程:该进程的父进程先于自身终止.其 ...

  9. linux下进程间管道通信,Linux下进程间通信方式-管道

    本文关键字: linux 管道通信,linux 进程通信方式,无名管道,有名管道 管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入.Linux的管道主要包括两种:无 ...

最新文章

  1. 运维基础(14)Mysql5.7 里4个数据库
  2. 关于jboss在jdk6下webservice不正常问题的解决
  3. DDD理论学习系列(11)-- 工厂
  4. 204787 ,194787 |0001 1131 0001 4226 7035 ![2480 ]
  5. pytorch1.7教程实验——分类器训练
  6. 算法达人看过来!你一展身手的好机会来了!
  7. 将一张图片修改为合适的像素大小
  8. 中国栓塞线圈市场趋势报告、技术动态创新及市场预测
  9. Spark内核解析之七:核心组件解析
  10. 《刺杀骑士团长》读后感
  11. java编写监听器步骤_IT兄弟连 JavaWeb教程 监听器1
  12. 免费开源商用级人脸识别库SeetaFace6使用教程(含人脸识别、口罩识别、活体识别、人眼状态判断、性别年龄识别等)
  13. android应用更换背景图片方法
  14. cubeIDE开发,在LCD显示摄像头抓取的图片数据
  15. 认识中药(3)--桔(jie)梗
  16. HEVC亮度分量帧内预测模式代码详解
  17. “ 愿我如星君如月,夜夜流光相皎洁 ...”
  18. 从0开始学习开发微信小程序(熟悉微信开发者工具页面,简单修改、添加一些内容)
  19. 理光M2004文件服务器,理光mp2014打印机怎么连接到电脑
  20. 【web百度离线地图开发】原生实现百度地图离线版速览

热门文章

  1. List转Map时把重复的value合并成List
  2. 如何简单快速画UML图?
  3. 有赞科技赴港递交上市申请:前三季度亏损2亿元,白鸦持股14%
  4. 自媒体怎么做,才能在短时间内变现赚钱?
  5. 百度云盘使用迅雷下载,不要任何插件
  6. [转载]robotium脚本封装为APK,实现脱离手机数据线,使用按钮点击控制用例
  7. 三星android10变化,关于从三星S10升级到S21的初步感受
  8. Android实习生的分享——总结一
  9. SQL SERVER导入mdf和ldf文件最简便的方法
  10. 使用Spring AOP自定义注解方式实现用户操作日志记录