接上贴(已结),我已找到“暴风影音”播放视频的窗口的句柄: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);
更怪的是,点击的按钮不停地“闪动”,谁能解决此问题?立马结贴

解决方案 »

  1.   

    给点提示,vb的当手工操作本机的暴风影音播放的时候,如何捕捉开始播放、继续播放、暂停、停止、手工移动进度条的进度?  
    并进而控制另一台电脑的暴风影音的开始播放、继续播放、暂停、停止、手工移动进度条的进度?  
    hook、子类技术吧  另外,一开机就启动暴风影音,并且是全屏的  
    我们是想一开机,就自动打开全屏模式  
    而不是 打开文件之后,才切换到全屏模式"首先这个用简单的方法需要两样技术:
    1.键盘鼠标模拟技术
    2.Socket技术用VB实现的步骤:
    0.窗口操作
    GetActiveWindow 获取活动窗口句柄
    FindWindow 使用窗口的类或标题找句柄
    WindowFromPoint 使用鼠标指向的坐标找句柄
    SetWindowPos 设置窗口位置
    GetWindowRect 得到窗口矩形键盘鼠标模拟技术
    keybd_event 模拟按键
    mouse_event 模拟鼠标
    SetCursorPos 设置鼠标坐标
    GetCursorPos 得到鼠标坐标
      

  2.   

    既然取得了程序的句柄,可以发送按键消息,暂停/播放是空格键PostMessage(Handle, WM_KEYDOWN, VK_SPACE, 0);不过,暴风影音是可以重新设置快捷键的,所以如果改变了设置,即使模拟点击,或者模拟按键,都会无效的...
      

  3.   

    真怪了,我在Timer1的事件中放入 PostMessage(Handle, WM_KEYDOWN, VK_SPACE, 0);
    只要是全屏播放,就不起作用,在其它状态下播放,都能控制。什么道理,有无办法解决
      

  4.   

    全屏的时候Handle是0吧?
      

  5.   

    模拟点击需要一个前提条件就是被按下的地方需要在所有窗口最上层。也就是说播放按钮被其他窗口遮挡,或是在全屏模式下的时候,播放按钮是没有显示的,模拟点击这种方法是点不到的这个代码在非全屏模式下可以用
    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来调用它内部的事件。当然这个开发难度就较高了
      

  6.   

    我没有看错吧,“非全屏模式下可以用”,非全屏模式下我已可控制。
    全屏真没有办法吗?
    “模拟点击需要一个前提条件就是被按下的地方需要在所有窗口最上层”。其实它就在最上层,我用Spy++(也是最顶层)去测句柄,一动鼠标Spy++就不见了。
    人工只要点一下鼠标或按一下空格键就会在在暂停核播放之间切换,代码控制咋就不行?
      

  7.   

    通过空格来控制播放和暂停(没有影评播放的时候是无效的,暴风影音忽略了按键,只有在有视频播放时有效)
    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;
      

  8.   

    H := FindWindow('Baofeng_StormPlayer', nil);
    是不是这句标题有问题,不论是否全屏句柄都为0
      

  9.   

    我是把timer1的间隔时间设为3秒,每3秒把句柄H记录一次
      

  10.   

    注入dll,或者远程线程直接执行对应函数,这个可以达到任何任何要求。 句柄方式要是多个暴风,或者要处理一些事件的时候,有异常。
      

  11.   

    直接这样,好像问题比较多,
    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);
      

  12.   

    你要先把鼠标移上去
    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);
    连续两次就正常了
      

  13.   

    mouse_event窗口必须在前台
    PostMessage和sentmessage窗口只要不是hide或最小化都可以