通过进程名取窗口句柄和进程ID的问题!~!~!~!~!~!~!

精通各种死法 2010-08-17 01:15:00
本人想取一个游戏的窗口句柄和进程ID,但由于这个游戏的窗口名是随角色名而改变的,要想达到通用的交易就无法使用findwindow来取窗口句柄。

现在知道游戏进程名:main.exe

那该怎么去找游戏的窗口句柄和进程ID呢

E语言可以通过进程名轻松获取窗口句柄和进程ID,VB怎么就这么难呢!!!!

希望大侠们帮忙解决下,小弟谢过!
...全文
736 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhbds 2012-09-28
  • 打赏
  • 举报
回复
高手。。
china_csm 2012-09-28
  • 打赏
  • 举报
回复
VS 假三上上左下

全部代码
china_csm 2012-09-28
  • 打赏
  • 举报
回复
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
贝隆 2012-09-26
  • 打赏
  • 举报
回复
通过Dos外部命令:TaskList来将系统中的所有进程都列出来,其中有进程的PID和进程名等信息。
这个例子是通过API函数实现DOS外部命令的例子
麻浦区保安 2012-09-26
  • 打赏
  • 举报
回复
小女子不才请多多指教!
麻浦区保安 2012-09-26
  • 打赏
  • 举报
回复
//定义一个进程ID和窗口句柄的结构体
typedef struct tagWNDINFO
{
DWORD dwProcessId;
HWND hWnd;
} WNDINFO, *LPWNDINFO;

//枚举回调函数
BOOL CALLBACK EnumWindsProc(HWND hWnd,LPARAM lParam)
{
DWORD dwProcessId;
//通过窗口句柄获取进程ID
GetWindowThreadProcessId(hWnd, &dwProcessId);

LPWNDINFO pInfo = (LPWNDINFO)lParam;
//匹配遍历窗口进程号与通过进程名得到的进程号
if(dwProcessId == pInfo->dwProcessId)
{

pInfo->hWnd = hWnd;//返回找到的窗口句柄

return FALSE;
}

return TRUE;
}



int GFindWindows(LPCTSTR proc_name,HWND *bufs, int buf_len)
{

int num=0;//返回的窗口句柄数目
// bufs = new HWND[buf_len];


DWORD dwPID = 0; //一个临时PID

int a[MAX_PATH];//存放进程PID的数组
DWORD Proc_num=0;//进程数量
CString procname(proc_name);
//匹配进程名是否含 exe

if (strcmp(procname.Right(procname.GetLength() - procname.ReverseFind('.') - 1),_T("exe")))
{
return -1;//参数错误返回-1
}

//************************根据进程名称获取进程ID***********//
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hSnapshot)
{
return 0;
}
PROCESSENTRY32 pe = { sizeof(pe) };
BOOL fOk;

for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe))
{
CString temp;
TRACE(("当前查找进程的名称是: %s\n"),pe.szExeFile);
TRACE(("当前进程PID: %d \n"),pe.th32ProcessID);
if (!_tcscmp(pe.szExeFile, proc_name))
{
//CloseHandle(hSnapshot);

temp.Format(("当前进程12PID: %d \n"),pe.th32ProcessID);

TRACE(("当前匹配的进程PID: %d \n"),pe.th32ProcessID);
a[Proc_num]= pe.th32ProcessID;
Proc_num++;

}

}
CString temp1;
//进程数量为0 提示找不到进程 返回为0;
if (Proc_num==0)
{
bufs=NULL;
buf_len=0;
return 0;

}else//找到一个匹配进程
{
//对一个进程名有多个相同进程ID的全部数组进行处理
for (int j=0;j<Proc_num;j++)
{

WNDINFO *wi=new WNDINFO;
wi->dwProcessId =a[j];//将获取到的进程ID传给结构体
wi->hWnd = NULL;
//遍历顶层窗口获取窗口句柄
EnumWindows(EnumWindsProc,(LPARAM)wi);
//比较设定的大小与设计大小
if (num<buf_len)
{
//判断当前进程是否无窗口 无窗口句柄则不保存
if (wi->hWnd!=NULL)
{
bufs[num]=wi->hWnd;
num++;
}
}

}

return num;//返回句柄个数

}

}
zzyong00 2010-08-17
  • 打赏
  • 举报
回复
用API,FindWindow ,GetWindowThreadProcessId
嗷嗷叫的老马 2010-08-17
  • 打赏
  • 举报
回复
用SPY++看一下类名是什么.

或者直接enumwindow后再getwindowthreadprocessid,判断一下是不是目标进程内的窗口.

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧