sanfer8889 发表于 2010-7-8 15:08:59

请教一个非焦点程序发送热键的问题。。

我从一个进程里面得到了一个PID,从PID获得了句柄,找出了窗口带“会议”字眼的句柄
现在我想向带“会议”字眼的窗口发送一个Alt+s的热键,弄来弄去都无法成功,“会议”窗口没有反应
求助各路大侠,请问是什么问题,谢谢!

窗口是非焦点的,不想Active它为焦点是因为会重修刷新窗口,内容会发生变化。。。。



这是上次得到afan大大的指点后,自己又改了一些的代码#include "PostMessage_UDF.au3"

;找到MIM进程PID
$list = ProcessList("tj.exe")

;得到PID号
$PID = $list;

;得到PID的句柄
$tjHandle = _Pid2Handle($PID)

For $i = 1 to $MIMHandle
   ;If StringInStr($tjHandle[$i], '会议') Then Msgbox(0, '窗口句柄:' & $tjHandle[$i], '窗口标题:' & $tjHandle[$i] & @LF & '含有“结果”字样。')
   ;If StringInStr($tjHandle[$i], '会议') Then Msgbox(0,$tjHandle[$i],$tjHandle[$i])
   ;If StringInStr($tjHandle[$i], '会议') Then Msgbox(0,'',$tjHandle[$i]) ;列出名
   ;If StringInStr($tjHandle[$i], '会议') Then Send ("!{S}",0)                ;发出按键

    If StringInStr($tjHandle[$i], '会议') Then _SendKeys($tjHandle[$i],"!{s}");<<-------不起效????
Next

Func _Pid2Handle($PID)
      ;Afan提示:通过进程pid返回包含其可见窗口标题和句柄的二维数组
      Local $Whall, $i, $pidHandle = [], $x = 1
      $Whall = WinList()
      For $i = 1 To $Whall
                If WinGetProcess($Whall[$i]) = $PID And BitAND(WinGetState($Whall[$i]), 2) Then
                        ReDim $pidHandle[$x + 1]
                        $pidHandle += 1
                        $pidHandle[$x] = $Whall[$i]
                        $pidHandle[$x] = $Whall[$i]
                        $x += 1
                EndIf
      Next
      Return $pidHandle
EndFunc   ;==>_Pid2Handle

afan 发表于 2010-7-8 15:30:34

本帖最后由 afan 于 2010-7-8 15:37 编辑

试试 _SendKeys($tjHandle[$i],"!{s}") 或者 _SendKeys($tjHandle[$i],"!s"),
_SendKeys的第一个参数应该是句柄 $tjHandle[$i],而不是标题 $tjHandle[$i]。

sanfer8889 发表于 2010-7-8 15:50:22

谢谢afan大大,我同时做了另外一个实验,
$tjHandle 至 $tjHandle 逐个手工试发送热键,都不起效,貌似向窗口直接发送热键应该是行不通,
我用信息工具看这个窗口时候,发现这个窗口组成很复杂,可能是由“多个不同元素窗口”组成一个窗口显示出来的,

如果实在没有什么办法,就真的只能把窗口active起来,然后模拟鼠标点击两层菜单进去了吗? 无奈。。。

afan 发表于 2010-7-8 16:12:44

直接手动按键alt-s窗口行不
页: [1]
查看完整版本: 请教一个非焦点程序发送热键的问题。。