找回密码
 加入
搜索
查看: 4799|回复: 13

AU3如何获取一个进程的句柄?

[复制链接]
发表于 2008-12-20 22:57:45 | 显示全部楼层 |阅读模式
因为这个进程的窗口,没有窗口标题,所以想通过句柄来操作。但是如何通过进程获得句柄。
 楼主| 发表于 2008-12-20 23:04:16 | 显示全部楼层
本想通过类来操作窗口,但却发现,原来有几个程序的类都是一样的。所以这样看来,还是只有句柄才是唯一。

而句柄每次启动程序都是不一样的,所以只有通过进程名来获取句柄了。
发表于 2008-12-21 00:18:30 | 显示全部楼层
送你个UDF
Func _GetHwndFromPID($PID)
        $hWnd = 0
        $stPID = DllStructCreate("int")
        Do
                $winlist2 = WinList()
                For $i = 1 To $winlist2[0][0]
                        If $winlist2[$i][0] <> "" Then
                                DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $winlist2[$i][1], "ptr", DllStructGetPtr($stPID))
                                If DllStructGetData($stPID, 1) = $PID Then
                                        $hWnd = $winlist2[$i][1]
                                        ExitLoop
                                EndIf
                        EndIf
                Next
                Sleep(100)
        Until $hWnd <> 0
        Return $hWnd
EndFunc   ;==>_GetHwndFromPID
 楼主| 发表于 2008-12-21 00:38:22 | 显示全部楼层
谢谢楼上的朋友热心解答,但可惜的是,经测试,失败了。
发表于 2008-12-21 12:46:38 | 显示全部楼层
嗯 那个是我以前收集的 也没用过 现在试试 果然不对
又找了一个
Func _WinGetByPid($iPID)
    Local $aWList = WinList()
    Local $aRet[1] = [0]

    For $iCC = 0 To $aWList[0][0]
        If WinGetProcess($aWList[$iCC][1]) = $iPID AND _
                BitAND(WinGetState($aWList[$iCC][1]), 2) Then
            ReDim $aRet[UBound($aRet)+1]
            $aRet[0] += 1
            $aRet[$aRet[0]] = $aWList[$iCC][1]
        EndIf
    Next
    If $aRet[0] = 0 Then
        Return SetError(1, 0, 0)
    Else
        Return $aRet
    EndIf
EndFunc


返回值的[1]是句柄
 楼主| 发表于 2008-12-21 18:43:01 | 显示全部楼层
原帖由 sxd 于 2008-12-21 12:46 发表
嗯 那个是我以前收集的 也没用过 现在试试 果然不对
又找了一个
[au3]Func _WinGetByPid($iPID)
    Local $aWList = WinList()
    Local $aRet[1] = [0]

    For $iCC = 0 To $aWList[0][0]
        If W ...

谢谢,对于有些隐藏的窗口还是不行,看来要另想他法了,不过还是谢谢你!:)
发表于 2008-12-21 21:12:39 | 显示全部楼层
虽然没有窗口标题,不过可以用窗口文本作匹配,试试
 楼主| 发表于 2008-12-21 21:36:36 | 显示全部楼层
原帖由 liongodmien 于 2008-12-21 21:12 发表
虽然没有窗口标题,不过可以用窗口文本作匹配,试试

这个程序就是贱,是文化管理用的软件,没有窗口文本,没有标题,什么都没有。
发表于 2008-12-21 21:39:55 | 显示全部楼层
那你想操作什么呢?得到进程句柄做什么用?
 楼主| 发表于 2008-12-21 22:45:51 | 显示全部楼层
原帖由 sanhen 于 2008-12-21 21:39 发表
那你想操作什么呢?得到进程句柄做什么用?

得到句柄后把窗口给关了。
发表于 2008-12-22 00:07:03 | 显示全部楼层
得到进程句柄关闭窗口?能不能直接结束进程呢。还省事。
发表于 2008-12-22 15:12:10 | 显示全部楼层
直接结束进程应该可以吧..总不会连进程都没有吧..
最好能把那个窗口的图片贴出来看看.大家也知道具体什么样的
发表于 2008-12-22 18:17:27 | 显示全部楼层
获取进程句柄的应该是这个。其他的自己搞定吧。



#Include <WinAPI.au3>

Local $Process,$ProcessID,$ProcesshWnd
$Process="notepad.exe"
Run($Process)
ProcessWait($Process)

$ProcessID = ProcessExists($Process)
$ProcesshWnd = _WinAPI_OpenProcess(0x001F0FFF, True, $ProcessID, False)

MsgBox(0,0, $ProcesshWnd )

_WinAPI_CloseHandle($ProcesshWnd)
发表于 2008-12-23 14:03:19 | 显示全部楼层
$hWin=WinGetHandle("[CLASS:#32770]") 可以通过窗口的类名来得到句柄
SendMessageA($hWin,16,0,0) ;16是退出消息。
还有就是枚举窗口。
$list = _WinAPI_EnumWindows(True)         
for $i = 1 to $list[0][0]
             If $list[$i][1]="窗口名" Then
                   $h=$list[$i][0]
             EndIf
next

这种方法可以,针对那些动态创建的窗口。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 11:31 , Processed in 0.086202 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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