有这么一个案例求教下大家,可以获得第三方应用的句柄,考虑在其窗口上悬浮一个操作按钮,点击按钮要求触发下面第三方应用的按钮事件,不知道是否可行
1
gino86 2019-05-05 14:17:04 +08:00
可以,enumwindows 函数枚举窗口 -> 找到第三方应用的按钮位置-> 发送鼠标点击事件到该按钮
|
2
daijinming OP @gino86 朋友能加我 QQ [email protected]
|
3
gino86 2019-05-05 14:26:36 +08:00
@加 QQ 就免了吧,这个网上搜索大把的资料
|
4
daijinming OP @gino86 我需要个 C#的 Demo,可以发个红包,交个朋友
|
5
qq316107934 2019-05-05 14:42:46 +08:00
@daijinming #4 用 SendMessage API 即可,V 站是鼓励开源和互相学习的平台,建议自己去学习下,并不复杂。
|
6
gino86 2019-05-05 14:45:10 +08:00
这是模拟鼠标点击的代码,其他的自己百度或者 google 吧,不难的
https://stackoverflow.com/questions/2416748/how-do-you-simulate-mouse-click-in-c |
7
huhangfei 2019-05-05 14:46:13 +08:00
我之前写的一个简单工具,里面有用,希望对你有帮助。~,~
https://github.com/huhangfei/yys_bee |
8
sarlanori 2019-05-05 15:03:04 +08:00
这个不需要悬浮一个操作按钮吧,直接操作第三方应用的按钮不就好了
|
9
daijinming OP @sarlanori 主要第三方的按钮不明显,又改不了
|
10
daijinming OP @gino86 第三方的软件是基于 C++开发的,并且不开源,我如何知道对方的按钮事件触发的是什么消息
|
11
sarlanori 2019-05-05 16:16:45 +08:00
@daijinming 用 Spy++ 查看 Windows Messages
|
12
xuddk727 2019-05-05 16:17:12 +08:00
已知窗口没必要 enumwindows 枚举,可通过 findwindow 查找特定窗口,发送按钮事件可通过 sendmessage 或者 mouseevnet 模拟鼠标
|
13
xuddk727 2019-05-05 16:19:38 +08:00
你需要确认下窗体是否是 dui,dui 的没句柄,非 dui 则直接 sendmessage 发送 bm_click 即可,wparam 和 lparam 查 msdn 可得。
|
14
xuddk727 2019-05-05 16:23:40 +08:00 1
|
15
daijinming OP @xuddk727 感谢,朋友
|
16
zjsxwc 2019-05-05 16:36:59 +08:00 via Android
迅雷这种根本没有按钮句柄,只能模拟鼠标点击
|
17
gino86 2019-05-05 16:41:49 +08:00
如果窗体是 dui,你可以获取窗体的位置,但按钮的位置你无法获取到吧, 包括 wpf 控件,基本上只能获取根窗体,窗体内的内容你是没有办法获取到的,按钮位置只能靠大概猜测
|
18
daijinming OP @gino86 调用第三方窗体中的按钮点击事件还需要知道按钮位置吗?
|
19
hakono 2019-05-05 16:50:03 +08:00
楼主你这是完全不懂 windows 开发啊
用 FindWindowA 找到对应窗口的句柄,然后计算下坐标,直接调用 SendMessage 往对应窗口发对应的鼠标消息就好了。和有没有按钮句柄没有关系 对应窗口的 classname 用 spy++看,需要接收什么消息搞不清楚的话也用 spy++抓一下就好了 这和用 C#还是 C++一点关系都没有,都是调 win32 api 罢了,用 python 都能写的东西 当然这个方法仅限于使用标准 windows 消息机制的程序。如果是游戏这种为了效率,跳过消息机制直接用 DirectInput 获取鼠标点击的话,需要模拟点击了。 |
20
gino86 2019-05-05 16:59:52 +08:00
我的意思是,如果是类似 dui 创建的应用,你是没有办法找到窗口句柄的,这些应用有且只有一个窗口,即根窗口(只有这个窗口有句柄),所有内容都在这个根上面画出来,当然按钮也是(因此没有句柄)。也就是说,sendMessage 就没有用了。当然你也没有办法取得按钮的准确位置就是了。
|
21
gino86 2019-05-05 17:03:28 +08:00
@hakono SendMessage 的第一个参数就是窗口句柄,按钮本身也是一个窗口,它在 window API 中也是通过 CreateWindow 创建出来的。
|
22
daijinming OP @gino86 朋友,能推荐本书吗,我也系统学习。
|
23
gino86 2019-05-05 17:23:07 +08:00
windows 程序设计第五版 作者:Charles Petzold
|
24
daijinming OP @gino86 曾经买过,两本还挺厚,珍藏了好多年,还特别新那
|
25
vmebeh 2019-05-05 17:56:12 +08:00 via iPhone
还是先了解一下 windows 消息循环比较好
|
26
hakono 2019-05-05 18:12:34 +08:00
@gino86
就算是用 DirectUI 写的,再怎么没控件句柄,也至少有个根窗口句柄。直接往跟窗口发消息和别的程序又没区别。 充其量也就是计算下坐标罢了。楼主这要求是盖上一个窗口,点击窗口会触发下方的按钮,点击时候的坐标就是下方按钮所在位置的坐标,直接换算一下坐标往对应的根窗口里发消息就好了,和控件句柄又没关系。 |
27
gino86 2019-05-05 18:19:01 +08:00
@hakono 这个真没有试过,子控件是否会响应主窗口的消息,我没有验证过,如果类似 wpf 的冒泡事件或者路由事件,应该可行的。
|
29
hakono 2019-05-05 19:12:14 +08:00
@gino86 是的。如果是要通过其他的方法的话,没有控件句柄,可以采用图片识别的方法。先截一张目标按钮图片,然后每次要点击按钮的时候,截图目标整个窗口,然后匹配图片位置。当然图片放大这些也需要做好模糊查找。匹配出按钮坐标,然后要么发消息要么模拟点击。
不过等全一套写下来了会发现,这不就是按键精灵吗 233 |
30
Cloutain 2019-05-06 11:50:56 +08:00
大漠或乐玩插件 ,识别点击按钮
|