WinForm自动化测试工具开发札记(3)

简介:
技术攻关
        从今天开始准备P0中所需技术的Demo,有了Demo就知道原理了,正式开始写的时候就没那么头大了.   
捕捉窗口的技术
        目的:得到当前鼠标位置是哪个窗口.
        以前学过一点点Win32,知道在Windows操作系统中,所有你见到的东西--无论是窗体还是控件,都是"窗口",是窗口,就会与一个WindowClass相关联.这个WindowClass,虽然有Class字样,但要注意,Win32编程用的是C语言,所以不是OO中的那个Class.
        下班前,照着书写了一个小程序,把代码贴在下面,大家可以自己运行一下.运行的时候,把鼠标四处移动一下.这个程序会以每秒一次的速率捕捉当前鼠标所指的窗口,并将窗口的标题(如果有)输出到命令行.
//------水之真谛
//------http://blog.csdn.net/FantasiaX

using
 System;
using System.Text;
using System.Threading;
using System.Runtime.InteropServices;

namespace RnP
{
    [StructLayout(LayoutKind.Sequential)]
    public struct Win32Point
    {
        public int x;
        public int y;
    }


    class Program
    {
        [DllImport("user32.dll")]
        private static extern bool GetCursorPos( ref Win32Point win32Point);

        [DllImport("user32.dll")]
        private static extern uint WindowFromPoint(Win32Point win32Point);

        [DllImport("user32.dll")]
        private static extern int GetWindowText(uint windowHandle, StringBuilder windowText, int maxChars);

        static void Main(string[] args)
        {
            Win32Point p= new Win32Point();
            while (true)
            {
                GetCursorPos(ref p);
                uint u = WindowFromPoint(p);
                StringBuilder sb = new StringBuilder(20);
                GetWindowText(u, sb, 20);
                Console.WriteLine(sb.ToString());
                Thread.Sleep(1000);
            }
        }
    }
}

技术分析
        昨天说来着,最头疼的一件事情是如何对付那些Win32里的数据类型.这些类型除了简单类型外,有很多是结构体.在从Win32到.NET的转换中,要用到MarshalAs这个Attribute,今天还注意到了另一个Attribute,那就是 [StructLayout(LayoutKind.Sequential)],
  不过查过MSDN才知道,这个Attribute加不加无所谓--这是默认值.
        今天最大的收获在这句里:
        [DllImport("user32.dll")]
        private static extern bool GetCursorPos( ref Win32Point win32Point);


        我们可以对照一下其Win32的原型:
      BOOL GetCursorPos( LPPOINT lpPoint );

        这个函数只接受一个参数,也就是LPPOINT,是一个指针类型.原来我想的是:指针吗,一个地址而已,转换成uint类型就行了.可后来想想,这是个于驴的智商相当想法,因为.NET平台(托管代码情况下,不考虑不安全代码)根本不支持指针,所以就算拿到这个以uint表达的指针也没用,因为你无法通过这个"指针"访问其代表的内存.呵呵,切身地开始怀念C语言了...自由与安全永远是冲突的.
        遂,从书找到上面的代码,不过我稍微做了一点改动.通过使用 ref Win32Point win32Point 一个参数, .NET平台巧妙地避开(或者说是"跳过")了指针,直接把一个Win32Point类型的参数"灌"进一个变量中了.
        是不是可以这样理解:
        当从Win32向.NET转换API函数的时候,如果遇到[out]类型指针参数ptr_T时,就使用 ref T 作为参数.明天我可能试着在RECT类型上试验一下:p
        刚才在调试的时候,发现这个问题:
        Win32Point p= new Win32Point();
        必需显式地赋值,也就是说去掉new Win32Point()是不行的.按理说是可以的.因为按照常识,
        int x;
        与
        Int32 x = new Int32();
        x=0;
        是等效的.
        不知道是不是.NET的Bug.
        
        我又试了试改成这
        [DllImport("user32.dll")]
        private static extern bool GetCursorPos( out Win32Point win32Point);

        也就是把ref 改成了out,就可以了.
        当然,下面的代码也要改成
        ........
         Win32Point  p;//= new Win32Point();
        ........
         GetCursorPos(out p);


        哈哈,这下简单了:以后就记住-------- Win32的[out]参数,对应.NET的out参数就OK啦!
        有所得,收工啦!!!
        大家周末快乐撒!




本文转自 水之真谛 51CTO博客,原文链接:http://blog.51cto.com/liutiemeng/18759,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
数据采集 算法 测试技术
【硬件测试】基于FPGA的1024QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的1024QAM基带通信系统的硬件测试版本,包含testbench、高斯信道模块和误码率统计模块。系统新增ila在线数据采集和vio在线SNR设置模块,支持不同SNR条件下的性能测试。1024QAM调制将10比特映射到复平面上的1024个星座点之一,实现高效数据传输。硬件测试结果表明,在SNR=32dB和40dB时,系统表现出良好的性能。Verilog核心程序展示了各模块的连接与功能实现。
57 7
|
16天前
|
机器学习/深度学习 人工智能 并行计算
AI部署架构:A100、H100、A800、H800、H20的差异以及如何选型?开发、测试、生产环境如何进行AI大模型部署架构?
AI部署架构:A100、H100、A800、H800、H20的差异以及如何选型?开发、测试、生产环境如何进行AI大模型部署架构?
AI部署架构:A100、H100、A800、H800、H20的差异以及如何选型?开发、测试、生产环境如何进行AI大模型部署架构?
|
4天前
|
SQL 安全 测试技术
2025接口测试全攻略:高并发、安全防护与六大工具实战指南
本文探讨高并发稳定性验证、安全防护实战及六大工具(Postman、RunnerGo、Apipost、JMeter、SoapUI、Fiddler)选型指南,助力构建未来接口测试体系。接口测试旨在验证数据传输、参数合法性、错误处理能力及性能安全性,其重要性体现在早期发现问题、保障系统稳定和支撑持续集成。常用方法包括功能、性能、安全性及兼容性测试,典型场景涵盖前后端分离开发、第三方服务集成与数据一致性检查。选择合适的工具需综合考虑需求与团队协作等因素。
72 24
|
11天前
|
人工智能 运维 API
无需配置开箱即用!MoLing:基于MCP开发的自动化办公服务,一键搞定文件与网页操作
MoLing是一款基于Go语言开发的跨平台办公自动化工具,通过操作系统API和浏览器自动化框架实现文件操作、命令执行及网页控制,无需额外依赖即可运行。
75 1
无需配置开箱即用!MoLing:基于MCP开发的自动化办公服务,一键搞定文件与网页操作
|
2月前
|
人工智能 自然语言处理 测试技术
Potpie.ai:比Copilot更狠!这个AI直接接管项目代码,自动Debug+测试+开发全搞定
Potpie.ai 是一个基于 AI 技术的开源平台,能够为代码库创建定制化的工程代理,自动化代码分析、测试和开发任务。
249 19
Potpie.ai:比Copilot更狠!这个AI直接接管项目代码,自动Debug+测试+开发全搞定
|
2月前
|
存储 人工智能 编译器
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
78 10
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
1月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的4ASK调制解调通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的4ASK调制解调系统的硬件测试版本,该系统包括testbench、高斯信道模块和误码率统计模块,并新增了ILA在线数据采集和VIO在线SNR设置功能。通过VIO设置不同SNR(如15dB和25dB),实现了对系统性能的实时监测与调整。4ASK是一种通过改变载波幅度表示数据的数字调制方式,适用于多种通信场景。FPGA平台的高效性和灵活性使其成为构建高性能通信系统的理想选择。
79 17
|
2月前
|
JSON 前端开发 测试技术
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
128 10
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
|
1月前
|
JSON 测试技术 网络安全
Apifox工具让我的 Socket.IO 测试效率翻倍
用了 Apifox 测试 Socket.IO 后,我整个人都升级了!不仅操作简单到令人发指,功能还贼全面,真的是 提升开发效率的神器 !
|
1月前
|
数据采集 消息中间件 API
微店API开发全攻略:解锁电商数据与业务自动化的核心能力
微店开放平台提供覆盖商品、订单、用户、营销、物流五大核心模块的API接口,支持企业快速构建电商中台系统。其API体系具备模块化设计、双重认证机制、高并发支持和数据隔离等特性。文档详细解析了商品管理、订单处理、营销工具等核心接口功能,并提供实战代码示例。同时,介绍了企业级整合方案设计,如订单全链路自动化和商品数据中台架构,以及性能优化与稳定性保障措施。最后,针对高频问题提供了排查指南,帮助开发者高效利用API实现电商数智化转型。适合中高级开发者阅读。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等