itljl 发表于 2008-12-20 22:57:45

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

因为这个进程的窗口,没有窗口标题,所以想通过句柄来操作。但是如何通过进程获得句柄。

itljl 发表于 2008-12-20 23:04:16

本想通过类来操作窗口,但却发现,原来有几个程序的类都是一样的。所以这样看来,还是只有句柄才是唯一。

而句柄每次启动程序都是不一样的,所以只有通过进程名来获取句柄了。

sxd 发表于 2008-12-21 00:18:30

送你个UDF
Func _GetHwndFromPID($PID)
        $hWnd = 0
        $stPID = DllStructCreate("int")
        Do
                $winlist2 = WinList()
                For $i = 1 To $winlist2
                        If $winlist2[$i] <> "" Then
                                DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $winlist2[$i], "ptr", DllStructGetPtr($stPID))
                                If DllStructGetData($stPID, 1) = $PID Then
                                        $hWnd = $winlist2[$i]
                                        ExitLoop
                                EndIf
                        EndIf
                Next
                Sleep(100)
        Until $hWnd <> 0
        Return $hWnd
EndFunc   ;==>_GetHwndFromPID

itljl 发表于 2008-12-21 00:38:22

谢谢楼上的朋友热心解答,但可惜的是,经测试,失败了。

sxd 发表于 2008-12-21 12:46:38

嗯 那个是我以前收集的 也没用过 现在试试 果然不对
又找了一个
Func _WinGetByPid($iPID)
    Local $aWList = WinList()
    Local $aRet =

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

返回值的是句柄

itljl 发表于 2008-12-21 18:43:01

原帖由 sxd 于 2008-12-21 12:46 发表 http://www.autoitx.com/images/common/back.gif
嗯 那个是我以前收集的 也没用过 现在试试 果然不对
又找了一个
Func _WinGetByPid($iPID)
    Local $aWList = WinList()
    Local $aRet =

    For $iCC = 0 To $aWList
      If W ...
谢谢,对于有些隐藏的窗口还是不行,看来要另想他法了,不过还是谢谢你!:)

liongodmien 发表于 2008-12-21 21:12:39

虽然没有窗口标题,不过可以用窗口文本作匹配,试试

itljl 发表于 2008-12-21 21:36:36

原帖由 liongodmien 于 2008-12-21 21:12 发表 http://www.autoitx.com/images/common/back.gif
虽然没有窗口标题,不过可以用窗口文本作匹配,试试
这个程序就是贱,是文化管理用的软件,没有窗口文本,没有标题,什么都没有。

sanhen 发表于 2008-12-21 21:39:55

那你想操作什么呢?得到进程句柄做什么用?

itljl 发表于 2008-12-21 22:45:51

原帖由 sanhen 于 2008-12-21 21:39 发表 http://www.autoitx.com/images/common/back.gif
那你想操作什么呢?得到进程句柄做什么用?
得到句柄后把窗口给关了。

sanhen 发表于 2008-12-22 00:07:03

得到进程句柄关闭窗口?能不能直接结束进程呢。还省事。

amgloon 发表于 2008-12-22 15:12:10

直接结束进程应该可以吧..总不会连进程都没有吧..
最好能把那个窗口的图片贴出来看看.大家也知道具体什么样的

sanhen 发表于 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)

akmm88 发表于 2008-12-23 14:03:19

$hWin=WinGetHandle("") 可以通过窗口的类名来得到句柄
SendMessageA($hWin,16,0,0) ;16是退出消息。
还有就是枚举窗口。
$list = _WinAPI_EnumWindows(True)         
for $i = 1 to $list
             If $list[$i]="窗口名" Then
                   $h=$list[$i]
             EndIf
next

这种方法可以,针对那些动态创建的窗口。
页: [1]
查看完整版本: AU3如何获取一个进程的句柄?