永发信息网

VB通过进程名获取窗口句柄?求例子

答案:1  悬赏:40  手机版
解决时间 2021-03-20 21:07
VB通过进程名获取窗口句柄?求例子
最佳答案
用API获取,
GetWindowThreadProcessId ihwnd, pid  得到进程ID
hProcess = OpenProcess(&H1F0FFF, False, pid)  获得进程句柄
例子:
Option Explicit

Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101
Private Const WM_CHAR = &H102
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Const GW_CHILD = 5
Private Const GW_HWNDNEXT = 2
Dim WarHand As Long '魔兽ID
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) '通过API函数延时
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer '后台键盘
Private Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long

Public Function GetHandle(Title As String) As Long
Dim tmp As String
   Dim hwnd As Long
   Dim lngProcID As Long
   Dim strTitle As String * 255     '//用来存储窗口的标题
      '//取得桌面窗口
   hwnd = GetDesktopWindow()
   '//取得桌面窗口的第一个子窗口
   hwnd = GetWindow(hwnd, GW_CHILD)
   '//通过循环来枚举所有的窗口
   Do While hwnd <> 0
        '//取得下一个窗口的标题,并写入到列表框中
GetWindowText hwnd, strTitle, Len(strTitle)
        If Left$(strTitle, 1) <> vbNullChar Then
             tmp = Left$(strTitle, InStr(1, strTitle, vbNullChar))
             If Left(tmp, Len(Title)) = Title Then
                GetHandle = hwnd
             End If
        End If
        '//调用GetWindow函数,来取得下一个窗口
        hwnd = GetWindow(hwnd, GW_HWNDNEXT)
   Loop
End Function
'//构造扫描码
Private Function MakeKeyLparam(ByVal VirtualKey As Long, ByVal flag As Long) As Long
     Dim s As String
     Dim Firstbyte As String     'lparam参数的24-31位
     If flag = WM_KEYDOWN Then   '如果是按下键
         Firstbyte = "00"
     Else
         Firstbyte = "C0"        '如果是释放键
     End If
     Dim Scancode As Long
     '获得键的扫描码
     Scancode = MapVirtualKey(VirtualKey, 0)
     Dim Secondbyte As String    'lparam参数的16-23位,即虚拟键扫描码
     Secondbyte = Right("00" & Hex(Scancode), 2)
     s = Firstbyte & Secondbyte & "0001"   '0001为lparam参数的0-15位,即发送次数和其它扩展信息
     MakeKeyLparam = Val("&H" & s)
End Function
Public Function PostKey(wHandle As Long, KeyCode As Long) '//发送按键
     PostMessage wHandle, WM_KEYDOWN, KeyCode, MakeKeyLparam(KeyCode, WM_KEYDOWN) '按下某键
     PostMessage wHandle, WM_KEYUP, KeyCode, MakeKeyLparam(KeyCode, WM_KEYUP)    '释放某键
End Function

Private Sub Form_Load()
If App.PrevInstance = True Then
        MsgBox "本程序已经运行。 ", vbInformation
        End
End If

    Timer1.Enabled = True
    Timer1.Interval = 100

End Sub

Private Sub TimePress_Timer()
PostKey WarHand, 38 '上,37左,40下,39左
'Sleep 10 '0.5S
PostKey WarHand, 38 '上,37左,40下,39左
'Sleep 10 '0.5S
PostKey WarHand, 37 '上,37左,40下,39左
'Sleep 10 '0.5S
PostKey WarHand, 40 '上,37左,40下,39左
'Sleep 10 '0.5S
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''

Private Sub Timer1_Timer()
    'F10,运行上上左下
    If GetAsyncKeyState(vbKeyF8) Then
        WarHand = GetHandle("Warcraft III")
        Debug.Print WarHand
        If WarHand <= 0 Then
'            Beep 2500, 1000
            MsgBox "Warcraft III 运行了吗?", vbExclamation
            TimePress.Enabled = False
'            Beep 2500, 500
            Exit Sub
        Else
            TimePress.Enabled = True
        End If
    End If
    'F12,停止,上上左下
    If GetAsyncKeyState(vbKeyF12) Then
        TimePress.Enabled = False
    End If
End Sub
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
谁有植物大战僵尸ol717植物进化流程图(包括
陶家庄在什么地方啊,我要过去处理事情
学生过生日喊同学怎么过省钱?重庆渝北工业园
怎样画立体长方形
我是三元牛奶的促销员,怎么在买卖场提高牛奶
我从磁盘管理中修改盘符,以前是从A到Z都有,
齐宣王好射说明了什么
星汇不锈钢装饰我想知道这个在什么地方
下图是一个“庆祝国庆60周年”的图标,图标中
下忙平地址在哪,我要去那里办事
1000块左右的结婚礼物送什么比较好
你不找我,我不打扰你,你若找我,我会好好的
什么是工科数学?
绝地求生:沙漠地图跳哪里?
x*y=-|y|,x△y=-x,如x=3,y=4时,x*y=-|4|=-4x
推荐资讯
汉口有到黄石仙岛湖的长途去汽车吗?
人工打垫层包工包料多钱1平米,谢!
本田CRV 和蒙迪欧制胜2.3时尚型 哪个油耗更高
英语阅读题:how did father impress the auth
哈尔滨哪里有教民谣唱法
迅达厨卫地址在什么地方,想过去办事
晓燕在学校春季运动会百米赛跑中以十六秒的成
天姿美发美容(凯德广场店)地址有知道的么?有
Y015/C709(路口)在什么地方啊,我要过去处理
12伏600w 小型发电机给12伏12安蓄电池充电用
我婆婆有两个儿子,我们是老大,我们还子小的
皮卡丘叫声wav格式的2到3秒的
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?