向隐藏的窗口发送按键或是向进程PID发送按键
本帖最后由 mmsivws 于 2009-7-2 15:17 编辑我试过很多办法都没办法实现向隐藏窗口发送按键,
本人刚学AU3,请问怎么样才能做到呢.
我说一下我详细的功能,我玩2061的时候,我要向后来指定的2061游戏的窗口发送空格键.不停的发...但是发的同时只对他唯一的窗口发,如果多开也要准确的发送过去.
或是直接向进程PID的程序发送一个按键......
高手们,请帮帮忙...... 用ControlClick,给你个例子。。。
在任务栏无显示的,用@SW_MINIMIZE,又显示的用@SW_HIDE
不知明白否#NoTrayIcon
#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_icon=net.ico
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_Res_Comment=kn007@126.com
#AutoIt3Wrapper_Res_Description=由kn007制作
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_LegalCopyright=kn007
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
Run("RUNDLL32 netshell.dll,StartNCW");最好不动鼠标,不然有时不行的
$hd="New Connection Wizard";把这里改为你中文版的窗口名,一般为 新建连接向导
WinWait($hd)
WinSetState($hd, '', @SW_MINIMIZE)
ControlClick($hd,"","Button2");注意Button后的数字,自己看看相不相同,你按下一步,再按上一步,按键数字会发生变化
ControlClick($hd,"","Button6")
ControlClick($hd,"","Button2")
ControlClick($hd,"","Button9")
ControlClick($hd,"","Button2")
ControlClick($hd,"","Button12")
Sleep(100);为了确保可行,可以不要的,不过这个应该得留着
ControlSetText($hd,"","Edit1","宽带连接")
Sleep(200)
ControlClick($hd,"","Button12")
Sleep(300)
ControlSetText($hd,"","Edit1","test");用户名
ControlSetText($hd,"","Edit2","test");密码
ControlSetText($hd,"","Edit3","test");再次密码
ControlClick($hd,"","Button17")
Sleep(200)
ControlCommand($hd,"","Button1","Check","");该良好了。。。
ControlClick($hd,"","Button21")
Sleep(100)
Exit这是上次帮人写的源码 我不是要这个. 这有点难度哦,比如说他的窗口控件名都是一样的。。。只能监控进程pid发送。。。,我的技术不到位,等高手来吧,抱歉 我也是这样想的....怎么样向一个进程的PID发送指定的按键呢. 本帖最后由 passkalilo 于 2009-6-27 14:04 编辑
首先获取这个进程的窗口句柄 ,再controlsend就可以了 6# passkalilo
跟没说似的,我都说了,你只跟话末
我找找看,有什么资料。。。 本帖最后由 passkalilo 于 2009-6-28 02:26 编辑
直接通过PID获取窗口句柄好像没有现成的函数,但是通过窗口句柄获取PID可以通过WinGetProcess实现,所以下面这个函数反过来采用枚举所有窗口的PID跟设定PID比较,从而找到指定PID对应的窗口句柄,_PIDSend(8888,"要发送的内容")
Func _PIDSend($PID,$msg)
$var = WinList() ;-------------------------获取所有窗口列表
For $i = 1 to $var ;------------------枚举所有窗口
If IsVisible($var[$i]) = 0 Then ;----判断是否隐藏窗口
$temppid = WinGetProcess($var[$i]) ;---获取Pid
If $temppid = $PID Then ExitLoop ;---是目标PID停止搜索
EndIf
Next
;MsgBox(0, "详细信息", "标题=" & $var[$i] & @LF & "句柄=" & $var[$i])
ControlSend($var[$i],$msg)
EndFunc
Func IsVisible($handle)
If BitAnd( WinGetState($handle), 2 ) Then
Return 1
Else
Return 0
EndIf
EndFunc确认一下思路是否正确,不一定是一点作用都没有吧, 有时候思路比代码更重要 大哥,代码我试过,不行.....
我是想把按键精灵的一个脚本改写成为AU3......
以下是精灵的脚本内容,精灵是7.0版本...
MessageBox "请移动到第一个窗口"
Delay 2000
Plugin hwnd1=Window.Find(0,"2061 Online")
//需要先得到可以发送按键消息的窗口
Plugin Hwnd1 = Window.FindEx(Hwnd1, 0, "Edit", 0)
//下面这句是得到当前最前面的窗口句柄
//下面这句是得到当前最前面的窗口句柄
Plugin Hwnd1 = Window.Foreground()
MessageBox "现在可以把记事本的窗口放在后台,或者是最小化"
//等待两秒钟
MessageBox hwnd1
n=10
For n
//下面这句用于向后台窗口句柄(变量:Hwnd)发送一个键盘(扫描码:98)按键
Plugin Bkgnd.KeyPress(Hwnd1, 32)
Delay 200
n=n+1
EndFor 这个代码的作用是:向指定的隐藏窗口不停的发送空格键..... While 1
_PIDSend(8888,"{enter}")
Sleep(500)
WEnd我这测试是可以的,你那不知道什么情况 不行的话,我也没办法了,水平不够 C:\Documents and Settings\Administrator.MMSIVWS\桌面\2222.au3(2,24) : ERROR: _PIDSend(): undefined function.
_PIDSend(1732,"{z}")
~~~~~~~~~~~~~~~~~~~~~~~^
C:\Documents and Settings\Administrator.MMSIVWS\桌面\2222.au3 - 1 error(s), 0 warning(s) 本帖最后由 passkalilo 于 2009-7-1 21:48 编辑
C:\Documents and Settings\Administrator.MMSIVWS\桌面\2222.au3(2,24) : ERROR: _PIDSend(): undefined function.
_PIDSend(2742,"{z}")
~~~~~~~~~~~~~~~~~~~~~~~^
C:\Documents and Settings\Administrato ...
mmsivws 发表于 2009-6-29 09:21 http://www.autoitx.com/images/common/back.gifWhile 1
_PIDSend(1732,"{z}")
Sleep(500)
WEnd
Func _PIDSend($PID,$msg)
$var = WinList() ;-------------------------获取所有窗口列表
For $i = 1 to $var ;------------------枚举所有窗口
If IsVisible($var[$i]) = 0 Then ;----判断是否隐藏窗口
$temppid = WinGetProcess($var[$i]) ;---获取Pid
If $temppid = $PID Then ExitLoop ;---是目标PID停止搜索
EndIf
Next
;MsgBox(0, "详细信息", "标题=" & $var[$i] & @LF & "句柄=" & $var[$i])
ControlSend($var[$i],"","",$msg)
EndFunc
Func IsVisible($handle)
If BitAnd( WinGetState($handle), 2 ) Then
Return 1
Else
Return 0
EndIf
EndFunc
页:
[1]
2