windows 消息机制求教,触发第三方软件的按钮事件 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
daijinming
V2EX    程序员

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

  •  
  •   daijinming 2019 年 5 月 5 日 4013 次点击
    这是一个创建于 2459 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    当然这个方法仅限于使用标准 windows 消息机制的程序。如果是游戏这种为了效率,跳过消息机制直接用 DirectInput 获取鼠标点击的话,需要模拟点击了。
    gino86
        20
    gino86  
       2019 年 5 月 5 日
    我的意思是,如果是类似 dui 创建的应用,你是没有办法找到窗口句柄的,这些应用有且只有一个窗口,即根窗口(只有这个窗口有句柄),所有内容都在这个根上面画出来,当然按钮也是(因此没有句柄)。也就是说,sendMessage 就没有用了。当然你也没有办法取得按钮的准确位置就是了。
    gino86
        21
    gino86  
       2019 年 5 月 5 日
    @hakono SendMessage 的第一个参数就是窗口句柄,按钮本身也是一个窗口,它在 window API 中也是通过 CreateWindow 创建出来的。
    daijinming
        22
    daijinming  
    OP
       2019 年 5 月 5 日
    @gino86 朋友,能推荐本书吗,我也系统学习。
    gino86
        23
    gino86  
       2019 年 5 月 5 日
    windows 程序设计第五版 作者:Charles Petzold
    daijinming
        24
    daijinming  
    OP
       2019 年 5 月 5 日
    @gino86 曾经买过,两本还挺厚,珍藏了好多年,还特别新那
    vmebeh
        25
    vmebeh  
       2019 年 5 月 5 日 via iPhone
    还是先了解一下 windows 消息循环比较好
    hakono
        26
    hakono  
       2019 年 5 月 5 日
    @gino86
    就算是用 DirectUI 写的,再怎么没控件句柄,也至少有个根窗口句柄。直接往跟窗口发消息和别的程序又没区别。 充其量也就是计算下坐标罢了。楼主这要求是盖上一个窗口,点击窗口会触发下方的按钮,点击时候的坐标就是下方按钮所在位置的坐标,直接换算一下坐标往对应的根窗口里发消息就好了,和控件句柄又没关系。
    gino86
        27
    gino86  
       2019 年 5 月 5 日
    @hakono 这个真没有试过,子控件是否会响应主窗口的消息,我没有验证过,如果类似 wpf 的冒泡事件或者路由事件,应该可行的。
    gino86
        28
    gino86  
       2019 年 5 月 5 日
    @hakono 如果新的按钮是覆盖在第三方应用的按钮上面,那直接在这个位置模拟鼠标点击那肯定可以
    hakono
        29
    hakono  
       2019 年 5 月 5 日
    @gino86 是的。如果是要通过其他的方法的话,没有控件句柄,可以采用图片识别的方法。先截一张目标按钮图片,然后每次要点击按钮的时候,截图目标整个窗口,然后匹配图片位置。当然图片放大这些也需要做好模糊查找。匹配出按钮坐标,然后要么发消息要么模拟点击。
    不过等全一套写下来了会发现,这不就是按键精灵吗 233
    Cloutain
        30
    Cloutain  
       2019 年 5 月 6 日
    大漠或乐玩插件 ,识别点击按钮
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2920 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 14:33 PVG 22:33 LAX 06:33 JFK 09:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86