找回密码
 加入
搜索
查看: 8368|回复: 26

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

  [复制链接]
发表于 2009-6-27 13:19:00 | 显示全部楼层 |阅读模式
本帖最后由 mmsivws 于 2009-7-2 15:17 编辑

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

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

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

高手们,请帮帮忙......
发表于 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
这是上次帮人写的源码
 楼主| 发表于 2009-6-27 13:38:18 | 显示全部楼层
我不是要这个.
发表于 2009-6-27 13:42:12 | 显示全部楼层
这有点难度哦,比如说他的窗口控件名都是一样的。。。只能监控进程pid发送。。。,我的技术不到位,等高手来吧,抱歉
 楼主| 发表于 2009-6-27 13:49:57 | 显示全部楼层
我也是这样想的....怎么样向一个进程的PID发送指定的按键呢.
发表于 2009-6-27 13:56:55 | 显示全部楼层
本帖最后由 passkalilo 于 2009-6-27 14:04 编辑

首先获取这个进程的窗口句柄 ,再controlsend就可以了
发表于 2009-6-27 14:41:06 | 显示全部楼层
6# 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[0][0]   ;------------------枚举所有窗口
          If IsVisible($var[$i][1]) = 0 Then     ;----判断是否隐藏窗口
                $temppid = WinGetProcess($var[$i][1]) ;---获取Pid
                If $temppid = $PID Then ExitLoop      ;---是目标PID停止搜索
          EndIf
        Next
        ;MsgBox(0, "详细信息", "标题=" & $var[$i][0] & @LF & "句柄=" & $var[$i][1]) 
        ControlSend($var[$i][1],$msg)
EndFunc

Func IsVisible($handle)
  If BitAnd( WinGetState($handle), 2 ) Then 
    Return 1
  Else
    Return 0
  EndIf
EndFunc
确认一下思路是否正确,不一定是一点作用都没有吧, 有时候思路比代码更重要
 楼主| 发表于 2009-6-29 01:31:28 | 显示全部楼层
大哥,代码我试过,不行.....
我是想把按键精灵的一个脚本改写成为AU3......

以下是精灵的脚本内容,精灵是7.0版本...

[Script]
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
 楼主| 发表于 2009-6-29 01:32:56 | 显示全部楼层
这个代码的作用是:向指定的隐藏窗口不停的发送空格键.....
发表于 2009-6-29 02:00:03 | 显示全部楼层
While 1 
    _PIDSend(8888,"{enter}")
    Sleep(500)
WEnd
我这测试是可以的,你那不知道什么情况
发表于 2009-6-29 02:05:01 | 显示全部楼层
不行的话,我也没办法了,水平不够
 楼主| 发表于 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)
发表于 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
While 1 

    _PIDSend(1732,"{z}")

    Sleep(500)

WEnd

Func _PIDSend($PID,$msg)

        $var = WinList()    ;-------------------------获取所有窗口列表

        For $i = 1 to $var[0][0]   ;------------------枚举所有窗口

          If IsVisible($var[$i][1]) = 0 Then     ;----判断是否隐藏窗口

                $temppid = WinGetProcess($var[$i][1]) ;---获取Pid

                If $temppid = $PID Then ExitLoop      ;---是目标PID停止搜索

          EndIf

        Next

        ;MsgBox(0, "详细信息", "标题=" & $var[$i][0] & @LF & "句柄=" & $var[$i][1]) 

        ControlSend($var[$i][1],"","",$msg)

EndFunc



Func IsVisible($handle)

  If BitAnd( WinGetState($handle), 2 ) Then 

    Return 1

  Else

    Return 0

  EndIf

EndFunc
 楼主| 发表于 2009-7-1 03:47:56 | 显示全部楼层
[img][/img]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-10-2 01:22 , Processed in 0.081992 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表