二、远程控制(二)
1 锁机对话框处理
a、锁机的画面实现
(1)、打开项目,右键–>添加–>选择资源—>选择Dialog即可,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GYfm1EHV-1682347698397)(D:\笔记图片\image-20230420222645256.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oeLQAoTm-1682347698398)(D:\笔记图片\Snipaste_2023-04-20_22-28-05.png)]
(2)、在添加的界面中,添加一些文本框如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WbwbwR8u-1682347698399)(D:\笔记图片\Snipaste_2023-04-20_22-32-05.png)]
(3)、在文本框中右键—>点击添加类,这样就创建了一个锁机的类,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mVpguJVb-1682347698399)(D:\笔记图片\Snipaste_2023-04-20_22-35-02.png)]
创建类的代码如下:
// LockInfoDialog.cpp: 实现文件
//
#include "pch.h"
#include "RemoteCtri.h"
#include "LockInfoDialog.h"
#include "afxdialogex.h"
// CLockInfoDialog 对话框
IMPLEMENT_DYNAMIC(CLockInfoDialog, CDialog)
CLockInfoDialog::CLockInfoDialog(CWnd* pParent /*=nullptr*/)
: CDialog(IDD_DIALOG_INFO, pParent)
{
}
CLockInfoDialog::~CLockInfoDialog()
{
}
void CLockInfoDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CLockInfoDialog, CDialog)
END_MESSAGE_MAP()
// CLockInfoDialog 消息处理程序
以及头文件:
#pragma once
// CLockInfoDialog 对话框
class CLockInfoDialog : public CDialog
{
DECLARE_DYNAMIC(CLockInfoDialog)
public:
CLockInfoDialog(CWnd* pParent = nullptr); // 标准构造函数
virtual ~CLockInfoDialog();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_DIALOG_INFO };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
};
2 锁机的功能完善以及解锁功能
a、锁机的功能完善
(1)、先定义一个锁机的全局变量,因为锁机在整个过程都会存在,所以不能定义在一个函数中
#include"LockInfoDialog.h"
CLockInfoDialog dlg;//定义一个全局变量
(2)、定义锁机的函数,锁机的实质就是控制鼠标的功能,屏蔽掉鼠标以及一些按键的功能即可。其中,锁机功能是在创建的一个线程里面实现的,因为如果实现在一个函数中,有个消息循环的设置,就会一直在该循环中,就会跳不到下一个解锁的功能函数中。
锁机的代码如下图所示:
unsigned threadid = 0;//定义一个全局的线程ID
//线程回调函数
unsigned __stdcall threadLockDlg(void* arg)
{
//创建一个窗口,显示上述的锁机的画面
dlg.Create(IDD_DIALOG_INFO, NULL);
//然后进行一些初始化
dlg.ShowWindow(SW_SHOW);
//遮蔽后台的窗口
CRect rect;//鼠标功能的类
//dlg.GetWindowRect(rect);//获取对话框的位置
//优化,让其处于屏幕的左上角,限制在左上角
rect.left = 0;
rect.top = 0;
//获取系统分辨率WxH
rect.right = GetSystemMetrics(SM_CXFULLSCREEN);
rect.bottom = GetSystemMetrics(SM_CYFULLSCREEN);
rect.bottom *= 1.08;//调整锁机的画面使之更加完美的覆盖屏幕
TRACE("right==%d,bottom==%d\r\n", rect.right, rect.bottom);
dlg.MoveWindow(rect);
//设置窗口置顶,不改变大小,不要移动
dlg.SetWindowPos(&dlg.wndTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
//隐藏任务栏
::ShowWindow(::FindWindow(_T("shell_TrayWnd"), NULL), SW_HIDE);
//设置限制鼠标的功能
ShowCursor(false);
//初次之外,还要限制鼠标访问的范围
//让鼠标限制在屏幕的左上角
rect.left = 0;
rect.top = 0;
rect.right = 1;
rect.bottom = 1;
ClipCursor(rect);//让其限制在弹出的对话框内
//添加一个消息循环,才可以出现锁机的窗口界面
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
//得到消息后,处理
TranslateMessage(&msg);
//分配消息
DispatchMessageW(&msg);
//设置按键后退出
//由解锁函数发送WM_KEYDOWN以及0x1B使其结束该循环然后就执行下面的部分
if (msg.message == WM_KEYDOWN)
{
//先打印看一下,每个按键的数值
TRACE("msg:%08X, wparam:%08X,lparam:%08X\r\n", msg.message, msg.wParam, msg.lParam);
if (msg.wParam == 0x1B)//按下esc按键退出
{