V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
daijinming
V2EX  ›  程序员

windows 消息机制求教,触发第三方软件的按钮事件

  •  
  •   daijinming · 2019-05-05 11:10:02 +08:00 · 3507 次点击
    这是一个创建于 2020 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有这么一个案例求教下大家,可以获得第三方应用的句柄,考虑在其窗口上悬浮一个操作按钮,点击按钮要求触发下面第三方应用的按钮事件,不知道是否可行

    30 条回复    2019-05-06 11:50:56 +08:00
    gino86
        1
    gino86  
       2019-05-05 14:17:04 +08:00
    可以,enumwindows 函数枚举窗口 -> 找到第三方应用的按钮位置-> 发送鼠标点击事件到该按钮
    daijinming
        2
    daijinming  
    OP
       2019-05-05 14:24:36 +08:00
    @gino86 朋友能加我 QQ [email protected]
    gino86
        3
    gino86  
       2019-05-05 14:26:36 +08:00
    @加 QQ 就免了吧,这个网上搜索大把的资料
    daijinming
        4
    daijinming  
    OP
       2019-05-05 14:38:27 +08:00
    @gino86 我需要个 C#的 Demo,可以发个红包,交个朋友
    qq316107934
        5
    qq316107934  
       2019-05-05 14:42:46 +08:00
    @daijinming #4 用 SendMessage API 即可,V 站是鼓励开源和互相学习的平台,建议自己去学习下,并不复杂。
    gino86
        6
    gino86  
       2019-05-05 14:45:10 +08:00
    这是模拟鼠标点击的代码,其他的自己百度或者 google 吧,不难的
    https://stackoverflow.com/questions/2416748/how-do-you-simulate-mouse-click-in-c
    huhangfei
        7
    huhangfei  
       2019-05-05 14:46:13 +08:00
    我之前写的一个简单工具,里面有用,希望对你有帮助。~,~
    https://github.com/huhangfei/yys_bee
    sarlanori
        8
    sarlanori  
       2019-05-05 15:03:04 +08:00
    这个不需要悬浮一个操作按钮吧,直接操作第三方应用的按钮不就好了
    daijinming
        9
    daijinming  
    OP
       2019-05-05 16:12:49 +08:00
    @sarlanori 主要第三方的按钮不明显,又改不了
    daijinming
        10
    daijinming  
    OP
       2019-05-05 16:15:20 +08:00
    @gino86 第三方的软件是基于 C++开发的,并且不开源,我如何知道对方的按钮事件触发的是什么消息
    sarlanori
        11
    sarlanori  
       2019-05-05 16:16:45 +08:00
    @daijinming 用 Spy++ 查看 Windows Messages
    xuddk727
        12
    xuddk727  
       2019-05-05 16:17:12 +08:00
    已知窗口没必要 enumwindows 枚举,可通过 findwindow 查找特定窗口,发送按钮事件可通过 sendmessage 或者 mouseevnet 模拟鼠标
    xuddk727
        13
    xuddk727  
       2019-05-05 16:19:38 +08:00
    你需要确认下窗体是否是 dui,dui 的没句柄,非 dui 则直接 sendmessage 发送 bm_click 即可,wparam 和 lparam 查 msdn 可得。
    xuddk727
        14
    xuddk727  
       2019-05-05 16:23:40 +08:00   ❤️ 1
    daijinming
        15
    daijinming  
    OP
       2019-05-05 16:33:53 +08:00
    @xuddk727 感谢,朋友
    zjsxwc
        16
    zjsxwc  
       2019-05-05 16:36:59 +08:00 via Android
    迅雷这种根本没有按钮句柄,只能模拟鼠标点击
    gino86
        17
    gino86  
       2019-05-05 16:41:49 +08:00
    如果窗体是 dui,你可以获取窗体的位置,但按钮的位置你无法获取到吧, 包括 wpf 控件,基本上只能获取根窗体,窗体内的内容你是没有办法获取到的,按钮位置只能靠大概猜测
    daijinming
        18
    daijinming  
    OP
       2019-05-05 16:47:35 +08:00
    @gino86 调用第三方窗体中的按钮点击事件还需要知道按钮位置吗?
    hakono
        19
    hakono  
       2019-05-05 16:50:03 +08:00
    楼主你这是完全不懂 windows 开发啊

    用 FindWindowA 找到对应窗口的句柄,然后计算下坐标,直接调用 SendMessage 往对应窗口发对应的鼠标消息就好了。和有没有按钮句柄没有关系
    对应窗口的 classname 用 spy++看,需要接收什么消息搞不清楚的话也用 spy++抓一下就好了

    这和用 C#还是 C++一点关系都没有,都是调 win32 api 罢了,用 python 都能写的东西

    当然这个方法仅限于使用标准 windows 消息机制的程序。如果是游戏这种为了效率,跳过消息机制直接用 DirectInput 获取鼠标点击的话,需要模拟点击了。
    gino86
        20
    gino86  
       2019-05-05 16:59:52 +08:00
    我的意思是,如果是类似 dui 创建的应用,你是没有办法找到窗口句柄的,这些应用有且只有一个窗口,即根窗口(只有这个窗口有句柄),所有内容都在这个根上面画出来,当然按钮也是(因此没有句柄)。也就是说,sendMessage 就没有用了。当然你也没有办法取得按钮的准确位置就是了。
    gino86
        21
    gino86  
       2019-05-05 17:03:28 +08:00
    @hakono SendMessage 的第一个参数就是窗口句柄,按钮本身也是一个窗口,它在 window API 中也是通过 CreateWindow 创建出来的。
    daijinming
        22
    daijinming  
    OP
       2019-05-05 17:21:46 +08:00
    @gino86 朋友,能推荐本书吗,我也系统学习。
    gino86
        23
    gino86  
       2019-05-05 17:23:07 +08:00
    windows 程序设计第五版 作者:Charles Petzold
    daijinming
        24
    daijinming  
    OP
       2019-05-05 17:29:47 +08:00
    @gino86 曾经买过,两本还挺厚,珍藏了好多年,还特别新那
    vmebeh
        25
    vmebeh  
       2019-05-05 17:56:12 +08:00 via iPhone
    还是先了解一下 windows 消息循环比较好
    hakono
        26
    hakono  
       2019-05-05 18:12:34 +08:00
    @gino86
    就算是用 DirectUI 写的,再怎么没控件句柄,也至少有个根窗口句柄。直接往跟窗口发消息和别的程序又没区别。 充其量也就是计算下坐标罢了。楼主这要求是盖上一个窗口,点击窗口会触发下方的按钮,点击时候的坐标就是下方按钮所在位置的坐标,直接换算一下坐标往对应的根窗口里发消息就好了,和控件句柄又没关系。
    gino86
        27
    gino86  
       2019-05-05 18:19:01 +08:00
    @hakono 这个真没有试过,子控件是否会响应主窗口的消息,我没有验证过,如果类似 wpf 的冒泡事件或者路由事件,应该可行的。
    gino86
        28
    gino86  
       2019-05-05 18:20:19 +08:00
    @hakono 如果新的按钮是覆盖在第三方应用的按钮上面,那直接在这个位置模拟鼠标点击那肯定可以
    hakono
        29
    hakono  
       2019-05-05 19:12:14 +08:00
    @gino86 是的。如果是要通过其他的方法的话,没有控件句柄,可以采用图片识别的方法。先截一张目标按钮图片,然后每次要点击按钮的时候,截图目标整个窗口,然后匹配图片位置。当然图片放大这些也需要做好模糊查找。匹配出按钮坐标,然后要么发消息要么模拟点击。
    不过等全一套写下来了会发现,这不就是按键精灵吗 233
    Cloutain
        30
    Cloutain  
       2019-05-06 11:50:56 +08:00
    大漠或乐玩插件 ,识别点击按钮
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2509 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:09 · PVG 00:09 · LAX 08:09 · JFK 11:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.