今天写了点代码,功能是筛选桌面中符合某些条件的窗口,模拟鼠标键盘实现全选 → 复制 → 检测剪切板 → 判断是否存在某些敏感字符串。

大致功能是这样。下面是代码(如果不想看不相关的内容可以直接跳到底部):

#include <afx.h>
#include <afxwin.h>
#include <Windows.h>
#include <vector>
#include <iostream>
#include <assert.h>
#include <psapi.h>
#include <tlhelp32.h>
#include <WtsApi32.h>
#include <locale.h>
#include <stdio.h>#pragma comment(lib,"WtsApi32.lib")using namespace std; // 获取剪切板内容
char* getClipBoardValue(){// 初始化char *url,*pData;size_t length;// 打开剪切板OpenClipboard(NULL);// 获取剪切板内的数据HANDLE hData=GetClipboardData(CF_TEXT);assert(hData!=NULL);// 获取数据长度length=GlobalSize(hData);url=(char*)malloc(length+1);// 将数据转换为字符pData=(char*)GlobalLock(hData);strcpy_s(url, length,pData); // 一系列善后工作GlobalUnlock(hData);CloseClipboard();url[length]=0;return url;
}// 遍历窗口
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{// 过滤不可见的窗口if(IsWindowVisible(hwnd)){// 过滤掉存在标题的窗口char szTitle[100];GetWindowText(hwnd, szTitle, 100);if(strcmp(szTitle,"") == 0){// 过滤掉大小不为 650*380 的窗口RECT rect;GetWindowRect(hwnd,&rect);if((rect.right - rect.left) == 650 && (rect.bottom - rect.top) == 380){// 过滤掉没有指定文本的窗口for(int i=0;i<5;i++){// 指定位置右键PostMessage(hwnd, WM_RBUTTONDOWN, 0,MAKELPARAM(200,200));PostMessage(hwnd, WM_RBUTTONUP,0,MAKELPARAM(200,200));Sleep(10);// 按下 'A'PostMessage(hwnd, WM_KEYDOWN,0x41,0);PostMessage(hwnd, WM_KEYUP,0x41,0);Sleep(10);// 指定位置右键PostMessage(hwnd, WM_RBUTTONDOWN, 0,MAKELPARAM(200,200));PostMessage(hwnd, WM_RBUTTONUP,0,MAKELPARAM(200,200));Sleep(10);// 按下 'C'PostMessage(hwnd, WM_KEYDOWN,0x43,0);PostMessage(hwnd, WM_KEYUP,0x43,0);}// 指定位置左键(取消选中)PostMessage(hwnd, WM_LBUTTONDOWN, 0,MAKELPARAM(200,200));PostMessage(hwnd, WM_LBUTTONUP,0,MAKELPARAM(200,200));// 输出剪切板内容cout << getClipBoardValue() << endl;// 判断是否匹配特征string s_clipBoard = getClipBoardValue();if(s_clipBoard.find("未来终生的伴侣")!=s_clipBoard.npos){cout << "检测到特征" << endl;}}}  }return TRUE;
}int _tmain(int argc, _TCHAR* argv[])
{EnumWindows(EnumWindowsProc, 0);getchar();return 0;
}

下面是 PostMessage 在本代码中的详解

首先就是,为什么用 PostMessage 而不用 SendMessage ?因为 SendMessage 会等待目标返回的结果,如果你发送消息的窗口一直不返回结果,它就会一直等待下去,导致程序卡死在这里,而 PostMessage 不会去关心这些问题。

这是上面代码中的一部分:

// 模拟鼠标
PostMessage(hwnd,                   // 目标窗口句柄WM_RBUTTONDOWN,        // 更多鼠标事件宏定义类型参考 : https://docs.microsoft.com/en-us/windows/win32/inputdev/mouse-input-notifications0,MAKELPARAM(200,200)        // x = 200,y = 200(相对于窗口的坐标,而不是屏幕的坐标));// 模拟键盘
PostMessage(hwnd,                   // 目标窗口句柄WM_KEYDOWN,                // 更多键盘事件共定义参考 : https://docs.microsoft.com/en-us/windows/win32/inputdev/keyboard-input0x41,                 // 更多按键种类宏定义参考 : https://docs.microsoft.com/zh-cn/windows/win32/inputdev/virtual-key-codes0);

C/C++ 实现模拟键盘鼠标相关推荐

  1. [转载]C#模拟键盘鼠标事件-SendKeys

    C#模拟键盘鼠标事件-SendKeys 2007-09-18 15:138596人阅读评论(1)收藏举报 1.模拟键盘事件 System.Windows.Forms.SendKeys以下是   Sen ...

  2. 程序模拟键盘鼠标操作

    用代码模拟键盘鼠标操作,主要用到keybd_event/mouse_event或者SendInput  API函数.使用示例如下(附注释):         /*         * 模拟键盘输入,以 ...

  3. 模拟键盘鼠标事件有两种方法

    实现一个鼠标或者键盘模拟器,可以完成很多功能,比如做一个简单的游戏外挂^_^.通常,模拟键盘鼠标事件有两种方法: 1.keybd_event, mouse_event 2.SendMessage, P ...

  4. Python 模拟键盘鼠标操作实战教程

    在某些情况下,如果我们需要进行自动化操作的应用没有提供相应的接口,我们无法直接通过Python来调用API实现自动化.这种情况下,Python也不是完全没有办法的,我们可以采用模拟键盘和鼠标的方式实现 ...

  5. Python ctypes 调用API函数模拟键盘鼠标事件

    在Python编程中, 有时需要模拟键盘或鼠标事件, 自动操作计算机, 比如玩游戏等. 本文介绍使用ctypes模块调用API函数, 模拟键盘鼠标事件的方法. 目录 1.导入ctypes模块 2.通过 ...

  6. pywin32激活指定窗口,模拟键盘鼠标

    import win32guihwnd=win32gui.FindWindow("ChatWnd", "标题") #获取窗口win32gui.SetForegr ...

  7. java 模拟鼠标_java实现简单的模拟键盘鼠标操作

    简简单单的记录: 近期需要用到模拟键盘鼠标操作,所以记录下来,以备后用,看了很多例子,未标明引用,请见谅 package com.text.jna; import javax.imageio.Imag ...

  8. java整理软件---java模拟键盘,鼠标操作

    1.Java 模拟键盘输入的小Demo,实现自动按下:模拟Ctrl+Alt+Z的按下和抬起    如果你开着qq的话,那么qq会自动弹出来.哈哈,代替人工操作; import java.awt.Rob ...

  9. Cypress之模拟键盘鼠标操作以及页面元素拖动操作

    上篇文章讲解了使用cypress框架时,如何上传或者下载文件,以及定位操作iframe和shadow dom下的页面元素.此次课程将讲解如何模拟键盘输入.鼠标操作以及如何拖动页面元素,另外,会介绍如何 ...

  10. python在程序中模拟键盘鼠标操作

    Python中模拟键盘和鼠标最著名的模块是:pymouse 和 pykeyboard.一次安装两个模块比较麻烦,而有一个库整合了这两个模块,而且能支持跨平台操作,这个库叫 PyUserInput,通过 ...

最新文章

  1. 淘宝李晓拴:淘宝网PHP电子商务应用
  2. 上云、微服务化和DevOps,少走弯路的办法
  3. python十进制小数转二进制_python十进制和二进制的转换方法(含浮点数)
  4. java idle,java – IMAP IDLE库
  5. MySQL函数大全 及用法示例
  6. RichTextBox 改变每行的字体颜色
  7. Activit系列之---Activity的生命周期
  8. freeldr 如何调用_BootMain的
  9. tomcat利用setenv对内存的限制和docker中tomcat内存的优雅配置
  10. java的数组排序和去重
  11. 【2021应用上架】超详细开发者账号申请应用上架审核经验整理
  12. mysql的month_MySQL MONTH()用法及代码示例
  13. rust怎么建柱子_原神慈盐之末任务怎么做?原神钟离传说任务的方碑柱子点亮顺序...
  14. Codeforces Round #643 (Div. 2) E. Restorer Distance 题解(三分)
  15. 装自己的服务器(教程)yum-jdk-mysql-防火墙-SVN-redis-申请域名
  16. antd的联级选择器异步调用编辑回显_react-uplod-img 是一个基于 React antd组件的图片上传组件...
  17. wamp出现拒绝访问
  18. Docker(五)进阶:Docker卷(volumes)
  19. 商标图形也会侵权?商标侵权如何界定?
  20. 公司上云在即,给大家分享一份猫厂、鹅厂和菊厂云服务器的测评情况

热门文章

  1. Unix网络编程第一卷学习总结
  2. HTML5期末大作业:我的家乡网站设计——我的家乡-杭州(7页) HTML+CSS+JavaScript 大学生家乡网页作品 老家网页设计作业模板 学生网页制作源代码下载
  3. Sql Server2008R2的完全卸载及重新安装
  4. 经典白平衡算法(灰度世界法和完美反射法MATLAB完整代码)
  5. (十:2020.08.28)CVPR 2018 追踪之论文纲要(译)
  6. 中职学生计算机学情分析报告,中职学校学生学情分析及对策
  7. Qt 之 直播流播放Qt-Vlc
  8. 《产品经理的第一本书》--产品经理职责
  9. 算法题15 穿越沙漠问题,飞机加油问题
  10. 小米6Android11刷机包,钉子户小米6的新生,换电池、背盖,升级android11