解决这个问题的方法如下:
1、首先新建一个程序。
2、在程序里面画一个“按钮”、两个编辑框、两个标签,然后改成相应的名字好辨认。
3、依次左键点击下图的:
一、个作夹(没有点击的情况下才需要点击)
二、程序
三、模块应用。
4、在浏览窗口找到下载存放的超级模块位置,点击打开“超级模块”。
5、在模块下面便会多出一个“超级模块”。
6、双击按钮1,在子程序“_按钮1_被单击”下面新建一个名为“i”的整数型变量,然后编写代码如下:i = 取句柄2 (“notepadexe”)编辑框1内容 = 到文本 (i)。
7、编写以上代码后,就能取到“notepadexe”的窗口句柄了,然后,再来取窗口标题!继续编写代码如下:编辑框2内容 = 取窗口标题 (取句柄2 (“notepadexe”))。
8、最后调试运行一下该程序,这样就完成了。
调用EnumWindows(EnumWindowsProc,0);
自己定义
BOOL CALLBACK EnumWindowsProc(
HWND hwnd, // handle to parent window
LPARAM lParam // application-defined value
){
DWORD PID;
BOOL Result=TRUE;
GetWindowThreadProcessId(hwnd,PID);
if (PID=GetCurrentProcessId())
{
g_hwin = hwnd;//这个g_hwin在你的DLL里定义为一个全局的HWND,也是你想要的句柄
Result = FALSE;
}
return Result;
}
lz可以试试当然如果知道被注入的进程的窗口名称就不用enumwindow了,直接用FindWindow(NULL, _T("XXXXXX"))的返回值得一个hwnd,然后得到进程id,再判断
了解什么是句柄就好理解了
就是获得这个窗口的识别代码
句柄就是用来区分各种内存对象的唯一标识符号,是个32位整数。
有些是整个系统唯一(如窗口句柄),有些是当前进程或线程中唯一
(如线程句柄,全局的有另一个标识符)。
详细的可分为许多种,都是以H开头的。在VB中使用时全部都用Long。
常见的有窗口句柄(HWND),设备描述表句柄(HDC),内存句柄(HMEM),
文件句柄,进程句柄,线程句柄,笔的类型句柄(HPEN),字体句柄(HFONT),
区域句柄(HRGN)等等。
在申请句柄时是要占用资源的,分三类SYSTEM、USER、GDI。
而WINDOWS的资源是固定的,并不随内存的扩大而扩大,所以使用完以后一定要释
放。
>
如果只用VB本身的代码一般是不会用到句柄的,但要是使用API函数的话,
大多数会使用。
再Windows系统中,句柄(我一直觉得这个词翻译得特别别扭)分为三大类:Kernel
Handle、UserHandle和应用程序自定义的Handle。
KernelHandle实际上是进程内Kernel对象的指针表索引,Kernel对象包括进程、文
件、信号等。但是MS为了掩盖着一事实,在系统启动时生成了一个所谓Obsfucator的值
(其实应该是Obfuscator,MicrosoftBugs(R):),生成Handle后将Handle与这个值异
或后返回给应用程序,所以看到的Handle都是一些很大而且毫无意义的数字。这些
Handle和索引的对象是由KRNL32DLL和VMM32VXD共同管理的,所以称之为Kernel
Handle。
UserHandle是用来标示窗口、DC等对象的,他们是真实的指针,但指向的并不是对象
的开头,有一个偏移量。同样,这些对象是由USER32DLL管理的。
第三种Handle不过是应用程序自定义的一些索引之类的东东,具体的意义和应用程序相关
用API获取,
GetWindowThreadProcessId ihwnd, pid 得到进程ID
hProcess = OpenProcess(&H1F0FFF, False, pid) 获得进程句柄
例子:
Option ExplicitPrivate 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 AppPrevInstance = True Then
MsgBox "本程序已经运行。 ", vbInformation
End
End If
Timer1Enabled = True
Timer1Interval = 100
End Sub
Private Sub TimePress_Timer()
PostKey WarHand, 38 '上,37左,40下,39左
'Sleep 10 '05S
PostKey WarHand, 38 '上,37左,40下,39左
'Sleep 10 '05S
PostKey WarHand, 37 '上,37左,40下,39左
'Sleep 10 '05S
PostKey WarHand, 40 '上,37左,40下,39左
'Sleep 10 '05S
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub Timer1_Timer()
'F10,运行上上左下
If GetAsyncKeyState(vbKeyF8) Then
WarHand = GetHandle("Warcraft III")
DebugPrint WarHand
If WarHand <= 0 Then
' Beep 2500, 1000
MsgBox "Warcraft III 运行了吗?", vbExclamation
TimePressEnabled = False
' Beep 2500, 500
Exit Sub
Else
TimePressEnabled = True
End If
End If
'F12,停止,上上左下
If GetAsyncKeyState(vbKeyF12) Then
TimePressEnabled = False
End If
End Sub
虽说不麻烦吧 但是贴出来也不少代码先声明下API 需要用到一个APIDLL命令 GetWindowThreadProcessId, 整数型, "user32dll", "GetWindowThreadProcessId"
参数 窗口句柄, 整数型
参数 进程标识符, 整数型, 传址下面就是详细代码了版本 2
支持库 eAPI子程序 _按钮1_被单击
局部变量 进程ID, 整数型
局部变量 句柄组, 文本型, , "0"
局部变量 I, 整数型
局部变量 文本标题, 文本型
局部变量 PID, 整数型
局部变量 文本, 文本型进程ID = 进程名称取PID (“QQexe”)
如果真 (进程ID = -1)
信息框 (“进程没有打开啊”, #错误图标, )
返回 ()
如果真结束
句柄组 = 取所有窗口列表 ()
文本标题 = 编辑框1内容
计次循环首 (取数组成员数 (句柄组), I)
GetWindowThreadProcessId (到整数 (句柄组 [I]), PID)
如果真 (PID = 进程ID)
文本 = 取窗口标题 (到整数 (句柄组 [I]))
如果真 (文本 = 文本标题)
信息框 (“窗口已经打开”, 0, )
返回 ()
如果真结束 如果真结束计次循环尾 ()
信息框 (“窗口未打开”, 0, )子程序 进程名称取PID, 整数型
参数 进程名, 文本型
局部变量 进程, 进程信息, , "0"
局部变量 i, 整数型进程 = 取系统进程列表 ()
计次循环首 (取数组成员数 (进程), i)
如果真 (进程 [i]进程名称 = 进程名)
返回 (进程 [i]进程标识符)
如果真结束计次循环尾 ()
返回 (-1)
以上就是关于易语言,取窗口句柄并 *** 作全部的内容,包括:易语言,取窗口句柄并 *** 作、求VC高手 获取当前进程的主窗口句柄、“获取屏幕的窗口句柄”是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)