win32API窗口句柄的获得

合集下载

pythonwin32apiwin32guiwin32con窗口句柄发送消息常用方法键盘输入

pythonwin32apiwin32guiwin32con窗口句柄发送消息常用方法键盘输入

pythonwin32apiwin32guiwin32con窗⼝句柄发送消息常⽤⽅法键盘输⼊import win32guiimport win32conimport win32api# 从顶层窗⼝向下搜索主窗⼝,⽆法搜索⼦窗⼝# FindWindow(lpClassName=None, lpWindowName=None) 窗⼝类名窗⼝标题名handle = win32gui.FindWindow("Notepad", None)# 获取窗⼝位置left, top, right, bottom = win32gui.GetWindowRect(handle)#获取某个句柄的类名和标题title = win32gui.GetWindowText(handle)clsname = win32gui.GetClassName(handle)# 打印句柄# ⼗进制print(handle)# ⼗六进制print("%x" %(handle) )# 搜索⼦窗⼝# 枚举⼦窗⼝hwndChildList = []win32gui.EnumChildWindows(handle, lambda hwnd, param: param.append(hwnd), hwndChildList)# FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None) ⽗窗⼝句柄若不为0,则按照z-index的顺序从hwndChildAfter向后开始搜索⼦窗体,否则从第⼀个⼦窗体开始搜索。

⼦窗⼝类名⼦窗⼝标题subHandle = win32gui.FindWindowEx(handle, 0, "EDIT", None)# 获得窗⼝的菜单句柄menuHandle = win32gui.GetMenu(subHandle)# 获得⼦菜单或下拉菜单句柄# 参数:菜单句柄⼦菜单索引号subMenuHandle = win32gui.GetSubMenu(menuHandle, 0)# 获得菜单项中的的标志符,注意,分隔符是被编⼊索引的# 参数:⼦菜单句柄项⽬索引号menuItemHandle = win32gui.GetMenuItemID(subMenuHandle, 0)# 发送消息,加⼊消息队列,⽆返回# 参数:句柄消息类型 WParam IParamwin32gui.postMessage(subHandle, win32con.WM_COMMAND, menuItemHandle, 0)# wParam的定义是32位整型,high word就是他的31⾄16位,low word是它的15⾄0位。

win32api的使用方法

win32api的使用方法

win32api的使用方法
win32api的使用方法主要包括以下几种:
1. 调用win32api函数,如GetCursorPos()函数获取光标位置。

具体地,需要在代码中声明一个POINT结构体,然后使用DllImport属性导入动态链接库,最后调用GetCursorPos()函数并将返回的光标位置赋值给POINT 结构体中的X和Y属性。

2. 使用invoke语句调用API函数。

在MASM汇编语言中,可以使用invoke语句来调用API函数,并指定函数的参数。

编译器会检查参数的数量和类型是否正确,如果参数少了或者类型不匹配,会报错。

3. 在调用API函数之前,需要先声明该函数。

声明的格式包括函数名、原型、距离、语言和参数列表,其中参数列表包括每个参数的名称、数据类型和修饰符。

需要注意的是,win32api的使用需要一定的编程基础和经验,因此在学习使用win32api之前,建议先学习相关的编程语言和基础知识。

同时,win32api的使用也需要考虑到操作系统的版本和位数,不同的操作系统版本和位数可能会对API函数的可用性和行为产生影响。

因此,在使用
win32api时,需要注意选择正确的API函数并了解其用法和限制。

获得桌面所有窗口句柄的方法总结

获得桌面所有窗口句柄的方法总结

获得桌面所有窗口句柄的方法总结第一种方法:1.先获得桌面窗口CWnd* pDesktopWnd = CWnd::GetDesktopWindow();2.获得一个子窗口CWnd* pWnd = pDesktopWnd->GetWindow(GW_CHILD);3.循环取得桌面下的所有子窗口while(pWnd != NULL){//获得窗口类名CString strClassName = _T("");//应该用TCHAR,用CStrting没有测试通过.::GetClassName(pWnd->GetSafeHwnd(),strClassName.GetB uffer(256),256);//获得窗口标题CString strWindowText = _T("");::GetWindowT ext(pWnd->GetSafeHwnd(),strWindowT ext.Ge tBuffer(256),256);//继续下一个子窗口pWnd = pWnd->GetWindow(GW_HWNDNEXT);}第二种方法:1.定义存放窗口句柄变量,和下标计数器HWND m_hWndFind[1000]; int m_Index;2.先写一个BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam) 的回调函数.BOOL CAllwindowsDlg::EnumWindowsProc(HWND hWnd, LPARAM lParam){//查找可见的窗口if(::GetWindowLong(hWnd,GWL_STYLE)& WS_VISIBLE){m_hwndFind[m_Index] = hWnd;//record the HWND handle into arraym_Index++;//count start}return 1;}3.调用(这个回调函数回自动递归的便利所有可见窗口,直到完毕)::EnumWindows(CAllwindowsDlg::EnumWindowsProc,NULL);4.取得窗口名称和类名for(int i = 0;i <=m_Index;i++){HWND m_wnd = m_hwndFind[i];::GetWindowT ext(m_wnd,m_store,128);::GetClassName(m_wnd,m_strClass,MAX_PATH-1);//获得窗口类名CString strClassName = _T("");::GetClassName(m_wnd,strClassName.GetBuffer(256),256);//获得窗口标题CString strWindowText = _T("");::GetWindowT ext(m_wnd,strWindowText.GetBuffer(256),256);}。

用Windows API取得窗体句柄二例

用Windows API取得窗体句柄二例

用Windows API取得窗体句柄二例文/胡克Windows通过句柄(Handle)识别每个窗体、控件、菜单和菜单项,当程序运行时,它所包含的每个部件都有一个惟一确定的句柄同其他的部件相区别句柄在Windows API中具有举足轻重的作用,现举三例,有兴趣的读者不妨一试。

获取窗体和控件的句柄步骤如下:1、为了看到显示于屏幕上所有的窗体和控件的句柄,用SetWindowPos函数设置窗口始终在最上面,其他窗口不能覆盖它,并使其只以标题显示于屏幕左上角。

(1)新建一工程,打开API Viwer:Add-ins→API Viewer→File→Load text file→Win32api.txt。

(2)将SetWindowPos函数的声明粘贴到窗体的声明部分:Private Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long。

(3)程序启动时调用SetWindowPos函数,窗体Load事件代码如下:Private Sub Form_Load()SetWindowPos Me.hwnd, -1, 0, 0, 0, 0, conSwpNoActivate Or conSwpShowWindow'使窗体一直置于最顶层End Sub卧龙传说提醒:当第二个参数hWndInsertAfter的值为-1时置于顶层;值为-2时不置于顶层。

2、为了找到鼠标指针的X和Y坐标,用上面同样的方法,通过API Viewer工具把获取的鼠标指针位置的API函数GetCursorPos的声明和结构类型声明粘贴到窗体的声明部分:Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As LongPrivate Type POINTAPIx As Longy As Long。

如何获得窗口句柄和改变窗口属性

如何获得窗口句柄和改变窗口属性

如何获得窗口句柄和改变窗口属性要获得窗口句柄(HWND),可以使用WinAPI中的FindWindow函数或FindWindowEx函数。

1. 使用FindWindow函数:```HWND hWnd = FindWindow(NULL, L"窗口标题");```这个函数会在当前活动的桌面窗口中查找指定标题的窗口,并返回窗口句柄。

2. 使用FindWindowEx函数:```HWND hParent = FindWindow(NULL, L"父窗口标题");HWND hWnd = FindWindowEx(hParent, NULL, NULL, L"子窗口标题");```这个函数会在指定父窗口中查找指定标题的子窗口,并返回子窗口句柄。

要改变窗口属性,可以使用WinAPI中的SetWindowLong函数或SetWindowPos函数。

1. 使用SetWindowLong函数:```LONG_PTR dwStyle = GetWindowLongPtr(hWnd, GWL_STYLE);dwStyle &= ~WS_CAPTION; // 移除标题栏SetWindowLongPtr(hWnd, GWL_STYLE, dwStyle);SetWindowPos(hWnd, NULL, x, y, width, height,SWP_FRAMECHANGED); // 重新绘制窗口```这个函数可以改变窗口的样式,如移除标题栏、调整窗口大小等。

2. 使用SetWindowPos函数:```SetWindowPos(hWnd, NULL, x, y, width, height,SWP_FRAMECHANGED);```这个函数可以重新设置窗口的位置、大小,并且可以实时更新窗口的样式。

需要注意的是,对于不属于当前进程创建的窗口,可能需要通过其他技术手段获取窗口句柄并改变属性,如使用钩子函数或其他进程间通信的方式。

用Windows API取得窗体句柄二例

用Windows API取得窗体句柄二例

h&& = GetFocus&&()
Debug.Print h&
End Sub
End Sub
卧龙传说提醒:当第二个参数hWndInsertAfter的值为-1时置于顶层;值为-2时不置于顶层。
2、为了找到鼠标指针的X和Y坐标,用上面同样的方法,通过API Viewer工具把获取的鼠标指针位置的API函数GetCursorPos的声明和结构类型声明粘贴到窗体的声明部分:
Private Sub Timer1_Timer()
Dim xy As POINTAPI'(声明变量类型)
GetCursorPos xy'(取得XY的座标)
ahwnd = WindowFromPointXY(xy.x, xy.y) '(取得当前鼠标坐标下窗口的句柄)
(2)将SetWindowPos函数的声明粘贴到窗体的声明部分:Private Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long。
(3)程序启动时调用SetWindowPos函数,窗体Load事件代码如下:
Private Sub Form_Load()
SetWindowPos Me.hwnd, -1, 0, 0, 0, 0, conSwpNoActivate Or conSwpShowWindow'使窗体一直置于最顶层

python和pywin32实现窗口查找、遍历和点击

python和pywin32实现窗口查找、遍历和点击

python和pywin32实现窗口查找、遍历和点击1.如何利用句柄操作windows窗体首先,获得窗体的句柄 win32api.FindWindows()第二,获得窗体中控件的id号,spy++第三,根据控件的ID获得控件的句柄(hwnd) GetDlgItem(hwnd,loginID)最后,利用控件句柄进行操作python可以通过win32api轻松获取控件的属性值通过标签找到主窗口句柄,然后通过主句柄获取下属控件句柄#-*- coding: utf-8 -*- ##设置编码方式import win32api,win32gui,win32conlabel = 'tt' #此处假设主窗口名为tthld = win32gui.FindWindow(None, label)if hld > 0:dlg = win32api.FindWindowEx(hld, None, 'Edit', None)#获取hld下第一个为edit控件的句柄buffer = '0' *50len = win32gui.SendMessage(dlg, win32con.WM_GETTEXTLENGTH)+1 #获取edit控件文本长度win32gui.SendMessage(dlg, win32con.WM_GETTEXT, len, buffer) #读取文本print buffer[:len-1]#虚拟鼠标点击按钮(或者回车)btnhld = win32api.FindWindowEx(hld, None,'Button', None) # win32gui.PostMessage(btnhld, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)# win32gui.PostMessage(btnhld, win32con.WM_KEYUP, win32con.VK_RETURN, 0)win32gui.PostMessage(btnhld,win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, 0) win32gui.PostMessage(btnhld, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, 0)#获取显示器屏幕大小width = win32api.GetSystemMetrics(win32con.SM_CXSCREEN) height = win32api.GetSystemMetrics(win32con.SM_CYSCREEN)#点击窗口buttonw=win32ui.FindWindow(clsname,windowtitle)b=w.GetDlgItem(窗口id)b.postMessage(win32con.BM_CLICK)#关闭窗体import win32uiimport win32conwnd=win32ui.FindWindow(classname,None)wnd.SendMessage(win32con.WM_CLOSE) 成功!import win32uiw=win32ui.FindWindow(classname,窗体title)print w.GetDlgItemText(0xFFFF) # 获得弹窗里的消息文字最小化窗体w=win32gui.FindWindow()win32gui.CloseWindow(w)浏览器密码控件操作# coding=utf-8import win32guiimport win32apiimport win32condef CallBack(hwnd, hwnds):if win32gui.GetClassName(hwnd) == 'Edit':hwnds[win32gui.GetClassName(hwnd)] = hwndreturn Truew1hd = win32gui.FindWindow(u'IEFrame', None)print '%x' %w1hd# w2hd = win32gui.FindWindowEx(w1hd,0,u'TabWindowClass', None) # print '%x' %w2hdhwndChildList = {}win32gui.EnumChildWindows(w1hd, CallBack, hwndChildList)for k,v in hwndChildList.items():print '%s %x' %(k,v)#win32api.SendMessage(v, win32con.WM_CHAR, ord('a'), 0) #t1 =win32gui.GetDlgItem(v,1)len1 = win32gui.SendMessage(v, win32con.WM_GETTEXTLENGTH)+1buffer = '0' *50win32gui.SendMessage(v, win32con.WM_GETTEXT, len1, buffer)print len1print buffer[:len1-1]win32gui.SendMessage(v,win32con.WM_SETTEXT,None,'902 723')。

pythonwin32 获取窗口句柄的方法

pythonwin32 获取窗口句柄的方法

在Python中,你可以使用`pywin32`库来获取窗口句柄。

这个库提供了与Windows API的接口,使得你可以在Python中执行许多底层的Windows操作。

以下是一个简单的示例,展示如何使用`pywin32`库获取窗口句柄:
```python
import win32gui
def get_window_handle(window_name):
hwnd = win32gui.FindWindow(None, window_name)
return hwnd
# 使用函数获取指定窗口的句柄
window_handle = get_window_handle("记事本")
print(window_handle)
```
在这个示例中,我们导入了`win32gui`模块,并定义了一个函数`get_window_handle`,该函数接受一个窗口名称作为参数,并返回该窗口的句柄。

然后,我们使用这个函数来获取名为"记事本"的窗口的句柄,并将其打印出来。

注意,这个方法只能获取到与给定名称匹配的第一个窗口的句柄。

如果存在多个窗口具有相同的名称,那么它将返回第一个匹配窗口的句柄。

python win32api 操作句柄

python win32api 操作句柄

python win32api 操作句柄Win32 API是一种用于在Windows操作系统上进行编程的应用程序接口。

它提供了一组函数和常量,开发人员可以使用这些函数和常量来访问操作系统的功能。

其中,win32api模块是Python中用于操作句柄的一个重要模块。

句柄是一种数据结构,用于标识操作系统中的各种资源,例如窗口、文件、进程等。

通过win32api模块,开发人员可以获取、创建、操作和关闭句柄,实现对各种资源的控制和管理。

下面将列举10个使用win32api操作句柄的例子。

1. 获取窗口句柄:可以使用win32api的FindWindow函数获取指定窗口标题的句柄。

例如,可以通过以下代码获取记事本窗口的句柄:```pythonimport win32guihwnd = win32gui.FindWindow(None, "记事本")```2. 关闭窗口:可以使用win32api的PostMessage函数向指定窗口发送关闭消息,实现关闭窗口的功能。

例如,可以通过以下代码关闭记事本窗口:```pythonimport win32api, win32conwin32api.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)```3. 获取进程句柄:可以使用win32api的OpenProcess函数获取指定进程的句柄。

例如,可以通过以下代码获取记事本进程的句柄:```pythonimport win32api, win32con, win32processpid = win32process.GetWindowThreadProcessId(hwnd)[1] hProcess = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, False, pid)```4. 读取进程内存:可以使用win32api的ReadProcessMemory函数读取指定进程的内存数据。

winmain 获取句柄

winmain 获取句柄

winmain 获取句柄
在WinMain函数中获取窗口句柄的方法如下所示:
```
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND hWnd; // 声明窗口句柄变量
// 创建窗口等相关代码...
hWnd = CreateWindow(/* 窗口创建参数 */);
// 获取到窗口句柄后可以继续操作...
return 0;
}
```
以上的代码段中,我们使用CreateWindow函数来创建窗口,并将其返回的窗口句柄赋值给hWnd变量。

通过这个变量,我们可以在之后的代码中对窗口进行操作和访问。

需要注意的是,WinMain函数是Windows应用程序的入口函数,在其中我们可以进行窗口的创建、消息循环等操作。

此处代码只是简单示例,并不包含完整的窗口创建过程。

希望对您有所帮助!。

getforegroundwindow用法

getforegroundwindow用法

getforegroundwindow用法GetForegroundWindow用法GetForegroundWindow是Win32 API中的一个函数,它可以获取当前活动窗口的句柄。

在Windows操作系统中,只有活动窗口才能接收键盘和鼠标输入。

因此,GetForegroundWindow的用途非常广泛,它可以帮助我们监测用户操作、进行窗口管理等。

本文将从不同的角度来探讨GetForegroundWindow的用法。

一、获取当前活动窗口GetForegroundWindow的最基本用法就是获取当前活动窗口的句柄。

这个句柄可以用于调用其他Win32 API函数,例如SendMessage、PostMessage等。

下面是一个示例代码:HWND hwnd = GetForegroundWindow();if (hwnd != NULL){// do something with the window handle}在实际应用中,我们可以利用这个函数来监测用户的操作,例如记录用户最近打开的窗口、跟踪用户的鼠标和键盘输入等。

二、判断窗口是否处于前台除了获取当前活动窗口的句柄,GetForegroundWindow还可以用来判断指定的窗口是否处于前台。

这个功能可以用于窗口管理,例如判断一个窗口是否需要置顶或者最小化。

下面是一个示例代码:HWND hwnd = FindWindow(NULL, "My Window Title");if (hwnd != NULL){HWND fgHwnd = GetForegroundWindow();if (fgHwnd == hwnd){// the window is in the foreground}else{// the window is not in the foreground}}在这个示例代码中,我们首先使用FindWindow函数来查找指定标题的窗口句柄。

windows获取窗口句柄

windows获取窗口句柄

windows获取窗⼝句柄windows获取窗⼝句柄1、使⽤FindWindow函数获取窗⼝句柄⽰例:使⽤FindWindow函数获取窗⼝句柄,然后获得窗⼝⼤⼩和标题,并且移动窗⼝到指定位置。

12 #include <Windows.h>3 #include <stdio.h>4 #include <string.h>5 #include <iostream.h>67int main(int argc, char* argv[])8 {9//根据窗⼝名获取QQ游戏登录窗⼝句柄10 HWND hq=FindWindow(NULL,"QQ2012");1112//得到QQ窗⼝⼤⼩13 RECT rect;14 GetWindowRect(hq,&rect);15int w=rect.right-rect.left,h=rect.bottom-rect.top;16 cout<<"宽:"<<w<<""<<"⾼:"<<h<<endl;1718//移动QQ窗⼝位置19 MoveWindow(hq,100,100,w,h,false);2021//得到桌⾯窗⼝22 HWND hd=GetDesktopWindow();23 GetWindowRect(hd,&rect);24 w=rect.right-rect.left;25 h=rect.bottom-rect.top;26 cout<<"宽:"<<w<<""<<"⾼:"<<h<<endl;2728return0;29 }2、使⽤EnumWindows和EnumChildWindows函数以及相对的回调函数EnumWindowsProc和EnumChildWindowsProc获取所有顶层窗⼝以及它们的⼦窗⼝(有些窗⼝做了特殊处理,⽐如QQ是不能通过这个⽅法获得的)⽰例:1 #include "stdafx.h"2 #include <Windows.h>3 #include <stdio.h>4 #include <tchar.h>5 #include <string.h>6 #include <iostream.h>78//EnumChildWindows回调函数,hwnd为指定的⽗窗⼝9 BOOL CALLBACK EnumChildWindowsProc(HWND hWnd,LPARAM lParam)10 {11char WindowTitle[100]={0};12 ::GetWindowText(hWnd,WindowTitle,100);13 printf("%s\n",WindowTitle);1415return true;16 }1718//EnumWindows回调函数,hwnd为发现的顶层窗⼝19 BOOL CALLBACK EnumWindowsProc(HWND hWnd,LPARAM lParam)20 {21if (GetParent(hWnd)==NULL && IsWindowVisible(hWnd) ) //判断是否顶层窗⼝并且可见22 {23char WindowTitle[100]={0};24 ::GetWindowText(hWnd,WindowTitle,100);25 printf("%s\n",WindowTitle);2627 EnumChildWindows(hWnd,EnumChildWindowsProc,NULL); //获取⽗窗⼝的所有⼦窗⼝28 }2930return true;31 }3233int main(int argc, _TCHAR* argv[])34 {35//获取屏幕上所有的顶层窗⼝,每发现⼀个窗⼝就调⽤回调函数⼀次36 EnumWindows(EnumWindowsProc ,NULL );3738return0;39 }3、使⽤GetDesktopWindow和GetNextWindow函数得到所有的⼦窗⼝⽰例:1 #include "stdafx.h"2 #include <Windows.h>3 #include <stdio.h>4 #include <tchar.h>5 #include <string.h>6 #include <iostream.h>78int main(int argc, _TCHAR* argv[])9 {10//得到桌⾯窗⼝11 HWND hd=GetDesktopWindow();1213//得到屏幕上第⼀个⼦窗⼝14 hd=GetWindow(hd,GW_CHILD);15char s[200]={0};1617//循环得到所有的⼦窗⼝18while(hd!=NULL)19 {20 memset(s,0,200);21 GetWindowText(hd,s,200);22/*if (strstr(s,"QQ2012"))23 {24 cout<<s<<endl;25 SetWindowText(hd,"My Windows");26 }*/27 cout<<s<<endl;2829 hd=GetNextWindow(hd,GW_HWNDNEXT);30 }3132return0;33 }。

pywin32获取windows的窗体内文本框的内容

pywin32获取windows的窗体内文本框的内容

用函数win32guisendmessage获取不了文本框的文本内容用str类型的参数接收获取的内容的话没有获取到东西而用pybuffer类型去获取则得到类似于16进制的东西
pywin32获取 windows的窗体内文本框的内容
用 spy++去确认找到了文本框的句柄了。
用函数 win32gui.SendMessage 获取不了文本框的文本内容,用 str 类型的参数接收获取的内容的话没有获取到东西,而用 PyBuffer 类型去 获取则得到类似于 16 进制的东西。
希望能找到解决方案。 以下是代码:
1 from win32gui import * 2 from win32api import * 3 from win32process import * 4 import win32c9 10 # 获取窗体句柄 11 hWnd = GetForegroundWindow() 12 print('hownd: ', hWnd) 13 14 FormThreadID = GetCurrentThreadId() 15 print('FormThreadID: ', FormThreadID) 16 17 CWndThreadID = GetWindowThreadProcessId(hWnd) 18 print('CWndThreadID: ', CWndThreadID) 19 20 AttachThreadInput(CWndThreadID[0], FormThreadID, True) 21 22 # 获取光标所在文本框句柄 23 hWnd = GetFocus() 24 print('hWnd: ', hWnd) 25 26 AttachThreadInput(CWndThreadID[0], FormThreadID, False) 27 28 # SendMessage(hWnd, win32con.WM_SETTEXT, 0, "mextb1860 第一个文本框") 29 30 # 文本框内容长度 31 length = SendMessage(hWnd, win32con.WM_GETTEXTLENGTH)+1 32 print('Length: ', length) 33 34 buf = '0'*length 35 # 生成buffer对象 36 # buf = PyMakeBuffer(length) 37 38 # 获取文本框内容 39 print('get: ', SendMessage(hWnd, win32con.WM_GETTEXT, length, buf)) 40 41 print('text: ', buf)

python中的句柄操作

python中的句柄操作

python中的句柄操作python中的句柄操作制作⼈:全⼼全意通过窗⼝标题获取句柄import win32guihld = win32gui.FindWindow(None,u"Adobe Acrobat") #返回窗⼝标题为Adobe Acrobat的句柄通过⽗窗⼝句柄获取⼦句柄#parent为⽗窗⼝句柄iddef get_child_windows(parent):'''获得parent的所有⼦窗⼝句柄返回⼦窗⼝句柄列表'''if not parent:returnhwndChildList = []win32gui.EnumChildWindows(parent, lambda hwnd, param: param.append(hwnd), hwndChildList)return hwndChildList根据句柄获取句柄标题和类名import win32guititle = win32gui.GetWindowText(jbid) #jbid为句柄id#获取标题clsname = win32gui.GetClassName(jbid)#获取类名根据句柄获取窗⼝位置import win32guileft, top, right, bottom = win32gui.GetWindowRect(jbid)#分别为左、上、右、下的窗⼝位置根据句柄进⾏点击操作import win32api,win32conwin32api.SetCursorPos([横坐标, 纵坐标])#根据横纵坐标定位光标win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)#给光标定位的位置进⾏单击操作(若想进⾏双击操作,可以延时⼏毫秒再点击⼀次)win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP | win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)#给光标定位的位置进⾏右击操作根据句柄将窗⼝放在最前win32gui.SetForegroundWindow(jbid)。

进程句柄获取

进程句柄获取
■PROCESS_SET_INFORMATION——允许使用SetPriorityClass函数设置进程的优先级。程。
■PROCESS_VM_OPERATION—允许使用WriteProcessMemory函数或VirtualProtectEx函数修改进程的地址空间。
HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessID);
其中,参数dwFlags:指定将要创建包含哪一类系统信息的快照句柄,本程序中只需要检索系统进程信息,因此可将其设置为TH32CS_SNAPPROCESS;函数第二个参数th32ProcessID`则指定了进程的标识号,当设置为0时指定当前进程。如果成功函数将返回一个包含进程信息的系统快照句柄。在得到快照句柄之后只能以只读的方式对其进行访问。至于对系统快照句柄的使用同普通对象句柄的使用并没有什么太大区别,在使用完之后也需要通过CloseHandle()函数将其销毁。
typedef struct tagPROCESSENTRY32 {
DWORD dwSize; //结构大小;
DWORD cntUsage; //此进程的引用计数;
DWORD th32ProcessID; //进程ID;
DWORD th32DefaultHeapID; //进程默认堆ID;
DWORD th32ModuleID; //进程模块ID;
HANDLE OpenProcess(
DWORD dwDesiredAccess, // access flag
BOOL bInheritHandle, // handle inheritance option
DWORD dwProcessId // process identifier
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第三组,这些是用来列举和处理任何窗口的超级武器!通过组合运用EnumWindows和EnumWindowsProc,EnumChildWindows与EnumChildProc,可以扫描桌面所有窗口并对之处理!
我的理解:(这部分用任务驱动式教学方法——谁让小弟是老师呢!xi xi)
第二组,通过win32定义的POINT结构(typedef struct tagPOINT { LONG x;
LONG y;} POINT),来获得当前鼠标光标位置的窗口HWND,这是最直观的武器!常规操作如下:先得到Cursor的POINT(BOOL GetCursorPos(LPPOINT)函数),再用WindowFromPoint。这样,我们几乎可以获得任何打开的有窗口的函数的HWND了!然后通过获取类名的win32 api函数(int GetClassName( HWND hWnd, LPTSTR lpClassName, int nMaxCount ))得到类名——这里的lpClassName最好用字符数组地址,nMaxCount就是数组的size了,同时,这种方法解决了第一个问题的麻烦!——我可以把鼠标放在任何地方!*^_^*
BOOL CALLBACK EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
BOOL CALLBACK EnumWindowsProc(HWND hwnd, L熟悉,是捕捉句柄的常规武器,FindWindow这两兄弟,可以接受捕捉对象的类名或者窗口标题之一,作为参数,返回一个HWND。可是对于一般群众,不一定知道所有的窗口(包括标题栏、按钮等等)的类名啊!——可以简单举例,请问你知道桌面图标的窗口的类名吗?而对于窗口标题,有可能会出现相同的标题,有两个窗口——指一个程序的两个进程,这又是个麻烦吧!好了,这个问题先放放,继续下一组。
1.HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)
HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName)
首先准备一个时钟,一种存类名方法(我用TMemo)
在定时器处理函数中:
1、得到当前cursor的点位置
2、再用WindowFromPoint,
3、然后得到类名,放到TMemo里
这样可以用鼠标获得你想要的窗口(包括按钮等),只要鼠标在窗口放一会儿。。。哈哈
第三种方法:其实利用FindWindow和循环结构也应该可以
任务:得到所有的窗口的类名。
解决办法1:我们会先想到第三组,可以自桌面窗口开始(它是所有窗口的祖先),依次扫描,获取类名并存之。有点儿像Visual Stdio的Spy++,或者Borland 的WinSight32,具体办法如下:(bcb中)
在主程序中,调用EnumWindows,传入YouEnumProc的函数地址作第一个参数,别忘了转换成WNDENUMPROC类型。第二参可NULL。::EnumWindows(reinterpret_cast<WNDENUMPROC> YouEnumProc,NULL);
2.HWND WindowFromPoint(POINT& Point)
3.BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
BOOL CALLBACK EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc,LPARAM lParam)
这篇文章是关于如何获取窗口句柄,以及有哪些函数可供使用的简单讨论!可适用于vc、bcb(其他的我没有试,估计可以),本人在bcb环境下试验。
首先我会罗列出一些获取句柄的win32 api 函数,然后简单说说他们的用途!最后说说我是怎么理解和应用的。见笑了!
可用的win32 api函数:
在YouEnumProc函数中,如果第一参HWND = = NULL,就跳离(return FALSE;),可以结束啦!
然后,把类名数组准备好,得到类名,存之。
返回真值,继续下一次扫描。
看起来并不复杂,是一种函数递归。但是我可会解释!面啊!: p
第二种解决方法:简单、直观——自己想出来的,颇得意
总结:其实得到HWND的方法很多,比如知道了窗口层次,依次向下扫。。。在说第三种呢!但我觉得,我的方法最直接有效,你说呢?
欢迎大家与我联系,并讨论这个问题!有关这个问题我还有许多疑问,比如HWND与ID的转换,在如IE页面中的表单控件的HWND或ID,还是其他的东东,总之是能识别他的东西。。。这个我很困惑,没办法!
相关文档
最新文档