再开一贴,模拟点击

liujiawa07 2012-06-18 04:38:24
接上贴(已结),我已找到“暴风影音”播放视频的窗口的句柄:H2
通过 PostMessage(H2, WM_Close, 0, 0);
可使该窗口关闭(验证了准确性)
现在,我想模拟“点击该窗口”,使它“暂停”和“播放”。
但以下代码不成功!
GetWindowRect(H2, Rect);
mouse_event(MOUSEEVENTF_LEFTDOWN,Rect.Left,Rect.Top,100,100);
mouse_event(MOUSEEVENTF_LEFTUP,Rect.Left,Rect.Top,100,100);
更怪的是,点击的按钮不停地“闪动”,谁能解决此问题?立马结贴
...全文
363 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjkgogo 2012-10-26
  • 打赏
  • 举报
回复
不知迅雷7可否实现这样的模拟点击
gdljf 2012-10-25
  • 打赏
  • 举报
回复
mouse_event窗口必须在前台
PostMessage和sentmessage窗口只要不是hide或最小化都可以
gdljf 2012-10-25
  • 打赏
  • 举报
回复
你要先把鼠标移上去
SetCursorPos(X,Y)
然后
sleep(1000)
等待暴风影音检查到鼠标是在它按钮上的,最后再
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
有时候用模拟点击,单击是没有效果,要双击才出单击的效果,我也不知道原因,反正
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
连续两次就正常了
一切若然 2012-07-02
  • 打赏
  • 举报
回复
直接这样,好像问题比较多,
mouse_event(MOUSEEVENTF_LEFTDOWN,Rect.Left,Rect.Top,100,100);
mouse_event(MOUSEEVENTF_LEFTUP,Rect.Left,Rect.Top,100,100);
我一般都是先
SetCursorPos(X,Y)
然后:
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
一如当初 2012-06-19
  • 打赏
  • 举报
回复
通过空格来控制播放和暂停(没有影评播放的时候是无效的,暴风影音忽略了按键,只有在有视频播放时有效)
var
H: HWND;
R: TRect;
begin
H := FindWindow('Baofeng_StormPlayer', nil);
if H <> 0 then
begin
PostMessage(H, WM_KEYDOWN, VK_SPACE, 0);
PostMessage(H, WM_KEYUP, VK_SPACE, 0);
end;
end;
liujiawa07 2012-06-19
  • 打赏
  • 举报
回复
我没有看错吧,“非全屏模式下可以用”,非全屏模式下我已可控制。
全屏真没有办法吗?
“模拟点击需要一个前提条件就是被按下的地方需要在所有窗口最上层”。其实它就在最上层,我用Spy++(也是最顶层)去测句柄,一动鼠标Spy++就不见了。
人工只要点一下鼠标或按一下空格键就会在在暂停核播放之间切换,代码控制咋就不行?
liujiawa07 2012-06-19
  • 打赏
  • 举报
回复
高人,谢了!
我试一下
一如当初 2012-06-19
  • 打赏
  • 举报
回复
模拟点击需要一个前提条件就是被按下的地方需要在所有窗口最上层。也就是说播放按钮被其他窗口遮挡,或是在全屏模式下的时候,播放按钮是没有显示的,模拟点击这种方法是点不到的

这个代码在非全屏模式下可以用
var
H: HWND;
R: TRect;
begin
H := FindWindow('Baofeng_StormPlayer', nil);
H := FindWindowEx(H, 0, 'ControlPanelWindow', nil);
if H <> 0 then
begin
if GetWindowRect(H, R) then
begin
if SetCursorPos(R.Location.X + R.Width div 2, R.Location.Y + R.Height div 2) then
begin
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
end;
end;
end;
end;


其实你那个关闭的方法是非正常的关闭,会引起暴风影音发生异常(已测)
我觉得严谨的办法是注入dll来调用它内部的事件。当然这个开发难度就较高了
liujiawa07 2012-06-19
  • 打赏
  • 举报
回复
当时看不到,应该是吧
s11ss 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
真怪了,我在Timer1的事件中放入 PostMessage(Handle, WM_KEYDOWN, VK_SPACE, 0);
只要是全屏播放,就不起作用,在其它状态下播放,都能控制。什么道理,有无办法解决
[/Quote]
全屏的时候Handle是0吧?
liujiawa07 2012-06-19
  • 打赏
  • 举报
回复
真怪了,我在Timer1的事件中放入 PostMessage(Handle, WM_KEYDOWN, VK_SPACE, 0);
只要是全屏播放,就不起作用,在其它状态下播放,都能控制。什么道理,有无办法解决

liujiawa07 2012-06-19
  • 打赏
  • 举报
回复
是不是没有获得焦点,怎么搞,成功就结贴!
代码跳动 2012-06-19
  • 打赏
  • 举报
回复
注入dll,或者远程线程直接执行对应函数,这个可以达到任何任何要求。 句柄方式要是多个暴风,或者要处理一些事件的时候,有异常。
liujiawa07 2012-06-19
  • 打赏
  • 举报
回复
我是把timer1的间隔时间设为3秒,每3秒把句柄H记录一次
liujiawa07 2012-06-19
  • 打赏
  • 举报
回复
H := FindWindow('Baofeng_StormPlayer', nil);
是不是这句标题有问题,不论是否全屏句柄都为0
liujiawa07 2012-06-18
  • 打赏
  • 举报
回复
可以的,只是在全屏不行。哪怕在全屏上点一下都可以,什么原因
kaikai_kk 2012-06-18
  • 打赏
  • 举报
回复
既然取得了程序的句柄,可以发送按键消息,暂停/播放是空格键

PostMessage(Handle, WM_KEYDOWN, VK_SPACE, 0);

不过,暴风影音是可以重新设置快捷键的,所以如果改变了设置,即使模拟点击,或者模拟按键,都会无效的...
liujiawa07 2012-06-18
  • 打赏
  • 举报
回复
麻烦发个代码,今天老是搞错
飞牛 2012-06-18
  • 打赏
  • 举报
回复
既然鼠标不行可模拟一下按键
还有在模拟鼠标时按下和弹起可以考虑一下延时看行不行
或者先将鼠标移过去,再模拟鼠标
liujiawa07 2012-06-18
  • 打赏
  • 举报
回复
2楼说的软件是什么?
我的目标就快实现了,谁帮我看看代码问题在哪里,为什么按钮不停闪动(鼠标移走才停下不闪动)
加载更多回复(2)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧