mmsivws 发表于 2009-6-27 13:19:00

向隐藏的窗口发送按键或是向进程PID发送按键

本帖最后由 mmsivws 于 2009-7-2 15:17 编辑

我试过很多办法都没办法实现向隐藏窗口发送按键,
本人刚学AU3,请问怎么样才能做到呢.

我说一下我详细的功能,我玩2061的时候,我要向后来指定的2061游戏的窗口发送空格键.不停的发...但是发的同时只对他唯一的窗口发,如果多开也要准确的发送过去.

或是直接向进程PID的程序发送一个按键......

高手们,请帮帮忙......

kn007 发表于 2009-6-27 13:20:45

用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这是上次帮人写的源码

mmsivws 发表于 2009-6-27 13:38:18

我不是要这个.

kn007 发表于 2009-6-27 13:42:12

这有点难度哦,比如说他的窗口控件名都是一样的。。。只能监控进程pid发送。。。,我的技术不到位,等高手来吧,抱歉

mmsivws 发表于 2009-6-27 13:49:57

我也是这样想的....怎么样向一个进程的PID发送指定的按键呢.

passkalilo 发表于 2009-6-27 13:56:55

本帖最后由 passkalilo 于 2009-6-27 14:04 编辑

首先获取这个进程的窗口句柄 ,再controlsend就可以了

kn007 发表于 2009-6-27 14:41:06

6# passkalilo


跟没说似的,我都说了,你只跟话末

我找找看,有什么资料。。。

passkalilo 发表于 2009-6-28 02:14:42

本帖最后由 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确认一下思路是否正确,不一定是一点作用都没有吧, 有时候思路比代码更重要

mmsivws 发表于 2009-6-29 01:31:28

大哥,代码我试过,不行.....
我是想把按键精灵的一个脚本改写成为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

mmsivws 发表于 2009-6-29 01:32:56

这个代码的作用是:向指定的隐藏窗口不停的发送空格键.....

passkalilo 发表于 2009-6-29 02:00:03

While 1
    _PIDSend(8888,"{enter}")
    Sleep(500)
WEnd我这测试是可以的,你那不知道什么情况

passkalilo 发表于 2009-6-29 02:05:01

不行的话,我也没办法了,水平不够

mmsivws 发表于 2009-6-29 09:21:19

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-6-29 13:10:45

本帖最后由 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

mmsivws 发表于 2009-7-1 03:47:56

页: [1] 2
查看完整版本: 向隐藏的窗口发送按键或是向进程PID发送按键