通过指点操作获得窗口句柄

对于pywin32配合spy++获得窗口句柄然后进行操作的部分理解 给自己的笔记: 首先,理解几个概念: 1.spy++ 可以直接看到窗口层级(树结构,写的也很清楚) 可以进行窗口定位(ctrl+f能进行定位) 上面的定位(就是那个狙击镜一样的东西)可以拖动到你的窗口 2.pywin32 官方解释自己百度,个人浅显的理解为对窗口(有句柄后)操作,结合代码可自动化 个人代码,不懂的问。 // 其中自己写了比较奇怪的参数,希望不要被嫌弃 // An highlighted block import win32gui import win32con import win32c 阅读详情

通过指点操作获得窗口句柄

赵砥:
    我用VB的sendkeys编写了一个向其他程序模拟键盘发送字符的工具,因VB编的程序体积太大,
    我想用Delphi重写,使用SendMessage等API函数,但我想找到一个用鼠标点一下其他进程的
    窗口便可获得该窗口的线程id和窗口句柄的方法,请指点一下。(使用findwindow获得窗口
    句柄要输入窗口标题,不好。)
回答:
    首先需要说明要在Delphi 实现Sendkeys功能,应该使用Journal Playback钩子(hook)函数,
    而不是使用SendMessage函数。下面我们来介绍如何利用鼠标移动让用户选择窗口,而程序
    进一步得到窗口的句柄。Windows API中有一个函数WindowFromPoint,只要知道鼠标的位置
    (屏幕坐标),就可以得到该位置所属的窗口的句柄,有了句柄,就可以利用其他的函数得到
    更多的信息。如果鼠标在程序的窗口中移动,可以得到MouseMove事件。要想鼠标在窗口外部
    移动时,仍能得到鼠标事件,必须使用SetCapture函数。下面这个例子就是利用这两个函数
    来实现你所要求的功能。
    
    type
     TForm1 = class(TForm)
     …………
    public
     procedure InvertTracker(hwndDest : Integer);
     end;
     …………
    var
     Form1: TForm1;
     mlngHwndCaptured: Integer;
     hWndLast: Integer;
     …………
    procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
    var pt : TPoint;
    begin
     if GetCapture() <> 0 then // 处于捕捉状态
     begin
     pt.X := X;
     pt.Y := Y;
     ClientToScreen(pt); // 获得鼠标的屏幕位置
     // 获得窗口句柄
     mlngHwndCaptured := WindowFromPoint(pt);
    
     if hWndLast <> mlngHwndCaptured then
     begin
     if hWndLast <> 0 then // 使窗口边框加粗
     InvertTracker(hWndLast);
     InvertTracker(mlngHwndCaptured);
     hWndLast := mlngHwndCaptured;
     end
     end;
     // 显示坐标和窗口句柄
     Caption := 'X: ' + IntToStr(x) + ', Y: ' + IntToStr(y)
     + ', hWnd: ' + IntToStr(mlngHwndCaptured);
    end;
    
    procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
    begin
     if SetCapture(handle) <> 0 then // 开始捕捉
     Cursor := crUpArrow;
    end;
    
    procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
    var strCaption: PChar;
    begin
     If mlngHwndCaptured <> 0 Then
     begin // 获得窗口标题
     strCaption := StrAlloc(1000);
     GetWindowText(mlngHwndCaptured, strCaption, 1000);
     Caption := StrPas(strCaption);
     InvalidateRect(0, PRect(0), True);
     mlngHwndCaptured := 0;
     Cursor := crDefault;
     ReleaseCapture;
     StrDispose(strCaption);
     hWndLast := 0;
     end
    end;
    // 使窗口边框变粗
    procedure TForm1.InvertTracker(hwndDest: Integer);
    var
     hdcDest, hPen, hOldPen, hOldBrush : Integer;
     cxBorder, cxFrame, cyFrame, cxScreen, cyScreen, cr : Integer;
     rc : TRect;
    Const NULL_BRUSH = 5;
    Const R2_NOT = 6;
    Const PS_INSIDEFRAME = 6;
    begin
     cxScreen := GetSystemMetrics(0);
     cyScreen := GetSystemMetrics(1);
     cxBorder := GetSystemMetrics(5);
     cxFrame := GetSystemMetrics(32);
     cyFrame := GetSystemMetrics(33);
     GetWindowRect(hwndDest, rc);
    
     hdcDest := GetWindowDC(hwndDest);
    
     SetROP2(hdcDest, R2_NOT);
     cr := clBlack;
     hPen := CreatePen(PS_INSIDEFRAME, 3 * cxBorder, cr);
    
     hOldPen := SelectObject(hdcDest, hPen);
     hOldBrush := SelectObject(hdcDest, GetStockObject(NULL_BRUSH));
     Rectangle(hdcDest, 0, 0, rc.Right - rc.Left, rc.Bottom - rc.Top);
     SelectObject(hdcDest, hOldBrush);
     SelectObject(hdcDest, hOldPen);
    
     ReleaseDC(hwndDest, hdcDest);
     DeleteObject(hPen);
    end;
    // 将窗口移动到左上角,并减少窗口高度,便于操作
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     Left := 0;
     Top :=0;
     ClientHeight := 76;
    end;
    
    运行该程序时,先在程序窗口内点一下,然后按住鼠标左键不放,移动鼠标,这时你会
    看到程序窗口的标题位置不断显示鼠标的当前位置(窗口坐标)和鼠标所在位置的窗口句柄。
    同时,被选中的窗口边框加粗,一旦放开左键,则程序窗口的标题就改为所选中窗口的标题。
    相信许多人对这种操作方式都会感到熟悉,因为象Spy++(Visual C++)、Magic Mouse、
    Capture Professional等很多软件都是采用类似的操作来选择窗口的。

4、MS-DOS 环境下的键盘与鼠标输入技术详解 本文详细解析了MS-DOS环境下的键盘和鼠标输入技术,涵盖MS-DOS的三种键盘输入方法(句柄函数、传统字符函数、ROM BIOS键盘函数)及其优缺点,同时介绍了如何处理Ctrl-C和Ctrl-Break中断。文章还讨论了指点设备(如鼠标)的驱动支持和操作方法,包括Microsoft鼠标驱动程序Int 33H协议的使用。通过代码示例和流程图,展示了在MS-DOS环境下如何实现稳定、可移植的输入处理机制,帮助开发者根据需求选择合适的输入方式,并提高程序的健壮性和用户体验。 阅读详情

相关推荐

delphi遍历窗体句柄

delphi遍历窗体句柄 准备区域截图用 类似qq截图

InvalidateRect-WINDOWS API

InvalidateRect添加一个区域到指定窗口的更新区域。更新区域代表必须被重绘的窗口客户区域的一部分。BOOL InvalidateRect(  HWND hWnd,           // 窗口的HANDLE  CONST RECT* lpRect,  // 矩形饿坐标  BOOL bErase          // 擦除状态);参数:hWnd:[输入]一个更新区域已经改变的窗口HAN

书山有路勤为径,学海无涯苦作舟 2083

ROS2前置基础教程 | 使用CMakeLists.txt编译ROS2节点

答案是有的,那就是cmake工具。cmake通过调用CMakeLists.txt直接生成Makefile。 2.新建CMakeLists.txt 在新建,输入下面内容。 3.编译代码 我们一般会创建一个新的目录,运行cmake并进行编译,这样的好处是不会显得那么乱。 创建好文件夹,接着运行cmake指令,代表到上级目录找。 运行完cmake你应该可以在build目录下看到cmake自动生成的Makefile了,接着就可以运行make指令进行编译 运行完上面的指令,就可以在build目录下发现节点了。ROS2

生活不止眼前的苟且 1万+

InvalidateRect

InvalidateRect   该函数向指定的窗体添加一个矩形,然后窗口客户区域的这一部分将被重新绘制。   BOOL InvalidateRect(   HWND hWnd, // handle of window with changed update region   CONST RECT *lpRect, // address of recta

pjz969的专栏 375

37张图详解MAC地址、以太网、二层转发、VLAN

MAC 地址 每个网卡或三层网口都有一个 MAC 地址, MAC 地址是烧录到硬件上,因此也称为硬件地址。MAC 地址作为数据链路设备的地址标识符,需要保证网络中的每个 MAC 地址都是唯一的,才能正确识别到数据链路上的设备。 MAC 地址由 6 个字节组成。前 3 个字节表示厂商识别码,每个网卡厂商都有特定唯一的识别数字。后 3 个字节由厂商给每个网卡进行分配。厂商可以保证生产出来的网卡不会有相同 MAC 地址的网卡。 现在可以通过软件修改 MAC 地址,虚拟机使用物理机网卡的 MAC 地址,并不能保.

networktp的博客 4745

用迅为RK3588开发板DIY无人机飞控:从电路设计到PID调参全记录

本文详细记录了使用迅为RK3588开发板DIY无人机飞控的全过程,从硬件选型、PCB设计到实时系统构建和PID调参。RK3588核心板凭借其强大的AI算力和丰富接口,成为高性能无人机控制解决方案的理想选择。文章还分享了视觉导航系统集成和实际飞行测试经验,为硬件爱好者提供实用参考。

weixin_29053577的博客 434

Invalidaterect()函数的作用详细解释

函数原型: BOOLInvalidateRect( HWND hWnd, // handle of window withchanged update region 窗口句柄。 CONST RECT *lpRect, // address ofrectangle coordinates rect结构体的指针。 BOOL bErase // erase-background flag

HotIce0 3万+

LLM的MCP协议:初识MCP,搭建第一个MCP Server

MCP(Model Context Protocol),是一个开发的协议,标准化了应用程序如何为大模型提供上下文。MCP提供了一个标准的为LLM提供数据、工具的方式,使用MCP会更容易的构建Agent或者是基于LLM的复杂工作流。

Criss@陈磊 2万+

按键精灵—遍历窗口,找出QQ类名,标题及句柄

遍历类名,找到自己想要的窗口类,标题及句柄,QQ自动后台多开发送消息。不过还不能实现自动回复,及别人发信息过来在右下角闪烁的时候,也没办法发送回复,望高人指点。以后还会陆续学习共享一些方法,顶我是我前进的动力,如果我的帖子再给埋了,我就真的没动力了。谢谢,O(∩_∩)O哈哈~ 1.         //设置文本消息行数 2.         line=10 3.         //定义数组存下窗口类名和窗口标题 4.         dim c(10) 5.         dim t(10) 6.  

5200

基于GA-BP遗传算法优化神经网络的多输入多输出数据预测-Python代码实现

多输入多输出的GA-BP神经网络

2301_80449389的博客 2308

ESP32设备驱动-TB6612FNG直流电机驱动

TB6612FNG 是一款出色的双电机驱动器,非常适合将两个小型直流电机(例如微型金属齿轮电机)连接到微控制器,它还可以用于控制单个双极步进电机。 基于 MOSFET 的 H 桥比 L298N 和 Sanyo 的 LB1836M 等旧式驱动器中使用的基于 BJT 的 H 桥效率高得多,后者允许将更多电流输送到电机,而从逻辑电源汲取的电流更少 (对于真正低电压的应用,LB1836 仍然具有 TB6612 的优势)。

视觉与物联智能 3403

Visual C++/MFC 指南(4):MFC 简要指点

 Visual C++/MFC 指南  第四课: MFC 简要指点已经作好开始写程序的准备了么?不,还没有。不要说你要让我教你写个愚蠢的hello world程序。如果你想好好利用Visual C++你就得会Microsoft Foundation Classes(MFC)。这些类非常好,它包含了所有我们在第二课里讨论过的好处。现在对你最重要的是CWnd类。它封装了那些需要窗口句柄的函

babyman的专栏 1022

ZYNQ microblaze boot.bin固化步骤

一,ZYNQ移植软核的原理FPGA规模巨大而且功能复杂,因此设计的每一个部分都从头开始是不切实际的。一种解决的办法是:对于较为通用的部分可以重用现有的功能模块,而把主要的时间和资源用在设计中的那些全新的、独特的部分。这就像是你在开发应用程序的时候就不用直接去写驱动物理硬件的代码,而是直接调用Windows提供的API就行了。

wangjie36的博客 2782

c#如何跳出一个函数_C# 句柄获取模块

前言 最近整一个项目,它需要能自动操纵设备软件上的某些按钮,来得到我们所期待的设备控制要求。 这样类似的功能,通常都是需要通过获取句柄的方式,然后发送Message来实现。以前我都是用VB6.0来实现,那是一个很老的编程环境,微软也不维护它了。还好,现在有了更为强大和满是甜糖的C#,于是怎样用C#来实现句柄的获取,成了很有趣的探讨内容。 句柄获取的方法,在网络上...

weixin_39647977的博客 343

06 - 深度学习处理器原理

深度学习处理器的重要性在于它们可以加速深度学习任务的执行,从而推动了人工智能的发展。传统的通用处理器虽然可以执行深度学习任务,但它们不够高效,需要消耗大量的能量和时间。深度学习处理器通过硬件加速和特定设计来优化深度学习任务的执行,从而可以提高执行效率、降低能耗和加速训练和推断过程。 深度学习处理器的发展也推动了深度学习算法的创新,因为算法的发展需要硬件的支持和驱动。同时,深度学习处理器的出现也促进了更广泛的应用场景,包括自动驾驶、人脸识别、语音识别、图像识别等领域。因此,深度学习处理器的重要性不仅在于加速

m0_51339444的博客 752

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

VC控件背景颜色初始化及对句柄和对象的理解

VC控件背景颜色初始化及对句柄和对象的理解 需要设计的界面如下 静态对话框背景颜色不采用系统颜色,这时候需要重载CDialog类中的HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) ,其中pDC是当前控件窗口的设备上下文而不是主窗口的设备上下文,改变控件窗口背景时需要改变的是主窗口的画刷(例如CDialog对话宽中有一个ID为IDC_...

oudianluoxuanwen的博客 310

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Visual C++/MFC 指南(4):MFC 简要指点 (转)

Visual C++/MFC 指南(4):MFC 简要指点 (转)[@more@] Visual C++/MFC 指南 第四课: MFC 简要指点 已经作好开始写程序的准备了么?不,还没有。不要说你要让我教你写个愚蠢的...

csd3176的博客 121

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

使用HandleSpy定位托管代码句柄泄漏

引子  我们知道句柄泄漏原因多种多样,一般泄漏的对象主要是内核句柄 、 文件句柄、互操作句柄等。 由于Framework的GC帮我们干了很多事情,所以很多C#程序员养成了吃饭后不洗碗的习惯,new出来的对象基本不考虑如何清理。 一般的对象当然不用考虑,但是遇到需要释放的对象(如IO操作、内核对象创建等),忘了释放,那问题便产生了。 环境说明 本文所有演示均在win7 32位。 需要安装

pcd的博客 2020

利用Winddows API改变窗口最小化与最大化

在unity中或者在C#程序中,通过Windows API来控制其他程序窗口或者当前窗口最小化与最大化时,该如何操作呢? 首先需要导入Windows API如: [DllImport(“user32.dll”)] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport...

qq_37699470的博客 6542

android按键精灵兼容性,为什么逍遥android模拟器安装按键精灵总是出错

如题 我是个程序盲啊 最近在电脑模拟器上玩咖啡恋人 想弄个后台脚本 只是在窗口里每分钟点几下那种可是查了许久实在是弄不懂句柄之类的Delay 200hwnd=Plugin.Window.ForegroundDelay 200For 5000Delay 300Call Plugin.Bkgnd.LeftClick (hwnd,229,250)Delay 300Call Plugin.Bkgnd.Le...

weixin_39819283的博客 751

如何把std::cout标准输出重定向到vs2019的输出窗口中

代码 #include <iostream> #include <io.h> #include <fcntl.h> #include <process.h> #include <Windows.h> #include<thread> int pipeHandles[2]; const int kBufferSize = 4...

shongbee2的专栏 4261

孙鑫VC学习笔记:第一讲

到现在才学VC,感觉太晚了; 到现在才看孙鑫VC视频教程,感觉太菜了。在这高手云集的地方,写这些东西有点让人发笑。唉,现在也不需要什么脸皮了,写就写吧,做下一些记录,以后可以看看自己是怎么成长的。希望有菜鸟们一起来学习,交流,更希望有大师指点指点,发发评论什么的!本来笨鸟要先飞的,我这笨鸟却这么晚才起飞,大家都飞出好远了,我唯有加倍的努力了!至于学习方法,还得请各位多多指教。下面开始我的教程:

遐迩思的专栏 2597
上一篇: Invoke Hidden Commands in the TWebBrowser
下一篇: 揭开Outlook Express编辑器的奥秘
iseekcode
博客等级 码龄18年 36粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值