如何通过句柄获取外部程序的窗口的内容
- 格式:doc
- 大小:13.23 KB
- 文档页数:5
.net 通过句柄获取窗口信息的方法嘿,朋友们!今天咱就来唠唠.net 通过句柄获取窗口信息这档子事儿。
咱就说啊,这窗口就好比是一个神秘的小盒子,里面装着各种信息呢。
而句柄呢,就像是打开这个小盒子的钥匙。
你想想,要是没有这把钥匙,你咋能知道盒子里有啥宝贝呀!
要通过句柄获取窗口信息,首先你得找到那个对的句柄呀。
这就跟找宝藏似的,得有耐心,还得有那么点技巧。
你得知道从哪儿开始找,怎么找才能又快又准。
然后呢,当你拿到句柄了,就可以开始施展魔法啦!你可以获取窗口的标题呀,大小呀,位置呀等等这些信息。
就好像你打开盒子后,能清楚地看到里面的各种宝贝一样。
比如说,你可以用它来看看某个程序的窗口标题是不是你想要的。
要是不对,那你就知道可能出问题啦!或者你想知道这个窗口在屏幕上的位置,好安排其他东西的摆放,这多方便呀!
哎呀,这可真是太有用了!你能想象如果没有这种方法,我们得费多大劲儿才能知道这些信息吗?那可真是像无头苍蝇一样乱撞呀!
在实际操作中呢,可不能马虎。
就像做饭一样,调料放多了放少了味道都不对。
你得小心谨慎地处理每一个步骤,不然可能就得不到你想要的结果啦。
而且呀,这还能帮我们解决一些看似很难的问题呢。
比如有时候程序出了点小毛病,通过获取窗口信息,说不定就能找到问题所在,然后轻松解决啦!
总之呢,.net 通过句柄获取窗口信息这招可真是太绝啦!它就像我们的秘密武器,能帮我们在编程的世界里披荆斩棘。
大家可得好好掌握呀,别浪费了这么好的工具!这就是我想说的,大家觉得怎么样呢?是不是很有道理呀!。
//利用句柄查出进程的详细信息#include <windows.h>#include <tlhelp32.h>#include <iostream.h>#pragma comment(lib, "kernel32.lib")//当在用户模式机内核模式下都提供所耗时间时,在内核模式下进行所耗时间的64位计算的帮助方法DWORD GetKernelModePercentage(const FILETIME &ftKernel, //在核心状态下消耗的时间const FILETIME &ftUser)//在用户状态下消耗的时间{//将FILETIME结构化为64位整数ULONGLONG qwKernel = (((ULONGLONG) ftKernel.dwHighDateTime)<<32) + ftKernel.dwLowDateTime;ULONGLONG qwUser = (((ULONGLONG) ftUser.dwHighDateTime)<<32) + ftUser.dwLowDateTime;//将消耗时间相加,然后计算消耗在内核模式下的时间百分比ULONGLONG qwTotal = qwKernel + qwUser;DWORD dwPct = (DWORD)(((ULONGLONG) 100*qwKernel) / qwTotal);return(dwPct);}//以下是将当前运行进程名和消耗在内核模式下的时间百分比分数都显示出来的应用程序void main(){HANDLE hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,//提取当前进程0);//如果是当前进程,就将其忽略//初始化进程入口PROCESSENTRY32 pe; //用来存放快照进程信息的一个结构体,引用所需包含的头文件#include “tlhelp32.h”::ZeroMemory(&pe,sizeof(pe));//为pe分配存储空间,并将其清0pe.dwSize = sizeof(pe);//按所有进程循环BOOL bMore = ::Process32First(hSnapshot, &pe);//获得进程快照中的第一个进程信息while(bMore){//打开用于读取的进程HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMA TION,//指明要得到的信息FALSE,//不必继承这一句柄pe.th32ProcessID);//要打开的进程if(hProcess!=NULL){//找出进程的时间FILETIME ftCreation, ftExit, ftKernelMode, ftUserMode;::GetProcessTimes(hProcess,//所感兴趣的进程&ftCreation,//进程的启动时间(绝对的)&ftExit,//结束时间(如果有的话)&ftKernelMode,//在内核模式下消耗的时间&ftUserMode);//用户模式下消耗的时间//计算内核模式消耗的时间百分比DWORD dwPctKernel = ::GetKernelModePercentage(ftKernelMode,//内核模式上消耗的时间ftUserMode);//在用户模式下消耗的时间//向用户显示进程的某些信息cout<<"Process ID:"<<pe.th32ProcessID<<",EXE file: "<<pe.szExeFile<<", % in kernel mode:"<<dwPctKernel<<endl;//消除句柄::CloseHandle(hProcess);}//转向下一个进程bMore = ::Process32Next(hSnapshot, &pe);}}。
C#写个类操作窗口(句柄操作)实现过程:过程一:找到当前鼠标位置的句柄您的使用2个WinAPI(俺喜欢自己封装下来用):View Code[DllImport("user32.dll", EntryPoint = "GetCursorPos")] public static extern bool GetCursorPos(out Point pt);[DllImport("user32.dll", EntryPoint = "WindowFromPoint")] public static extern IntPtr WindowFromPoint(Point pt);//鼠标位置的坐标public static Point GetCursorPosPoint(){Point p = new Point();if (GetCursorPos(out p)){return p;}return default(Point);}///<summary>///找到句柄///</summary>///<param name="p">坐标</param>///<returns></returns>public static IntPtr GetHandle(Point p){return WindowFromPoint(p);}过程二:改变窗口的Text您的使用1个WinAPI:View Code[DllImport("user32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);///<summary>///给窗口发送内容///</summary>///<param name="hWnd">句柄</param>///<param name="lParam">要发送的内容</param>public static void SetText(IntPtr hWnd, string lParam){SendMessage(hWnd, WM_SETTEXT, IntPtr.Zero, lParam);}private const int WM_SETTEXT = 0x000C;通过这个方法就能改变Text的值了。
利用句柄操作窗口
要利用句柄操作窗口,可以使用以下步骤:
1. 获取窗口句柄:使用FindWindow或FindWindowEx函数来查找窗
口句柄。
这些函数接受窗口类名、窗口标题等参数,根据参数信息找到对
应窗口的句柄。
2. 操作窗口:通过窗口句柄可以执行多种操作,如最小化、最大化、还原、关闭窗口等。
可以使用ShowWindow函数来改变窗口的可见状态,
使用SendMessage或PostMessage函数发送消息给窗口来模拟按键操作或
执行其他更复杂的任务。
3. 获取窗口属性:通过窗口句柄可以获取窗口的属性,如位置、大小、标题等。
可以使用GetWindowRect函数来获取窗口的坐标信息,使用GetWindowText函数来获取窗口的标题。
需要注意的是,操作窗口需要有足够的权限,有些窗口可能受到系统
保护,无法直接操作。
此外,窗口句柄是一个唯一标识符,所以需要确保
获得的句柄是正确的窗口句柄才能进行操作。
vba读取外部程序窗体内容要读取外部程序窗体的内容,你可以使用Windows API函数来实现。
下面是一个示例代码,可以读取外部程序的窗体标题:vbaOption ExplicitPrivate Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal nMaxCount As Long) As LongSub GetExternalWindowContent()Dim externalWindowhWnd As LongDim windowTitle As StringDim windowText As String' 获取外部程序窗口句柄externalWindowhWnd = FindWindow(vbNullString, "外部程序窗口标题")If externalWindowhWnd <> 0 Then' 获取窗口标题windowTitle = Space(255)GetWindowT ext externalWindowhWnd, windowTitle,Len(windowTitle)windowTitle = Left(windowTitle, InStr(windowTitle, vbNullChar) - 1)' 获取窗口内容windowText = Space(4096)GetWindowT ext externalWindowhWnd, windowText,Len(windowText)windowText = Left(windowText, InStr(windowText, vbNullChar) - 1)MsgBox "窗口标题: " & windowTitle & vbNewLine & vbNewLine & "窗口内容: " & windowTextElseMsgBox "外部程序窗口未找到"End IfEnd Sub示例代码中的`FindWindow`函数用于获取外部程序窗口的句柄,`GetWindowText`函数用于获取窗口的标题和内容。
python获取应用程序窗口程序内容的方法
在Python中,可以使用第三方库来获取应用程序窗口的内容。
其中最常用的是pyautogui和pygetwindow。
1. pyautogui
pyautogui是一个Python模块,可以模拟键盘和鼠标操作,也可以截取屏幕上的图像。
使用pyautogui可以截取应用程序窗口的图像,并保存为文件。
具体步骤如下:
```python
import pyautogui
截取整个屏幕的图像并保存为文件
().save('')
截取特定窗口的图像并保存为文件
首先需要找到窗口的句柄或标题,可以使用pygetwindow模块来获取import pygetwindow as gw
window = ()
screenshot = (region=(, , , ))
('window_')
```
2. pygetwindow
pygetwindow是一个Python模块,可以获取应用程序窗口的信息,包括窗口的句柄、标题、大小、位置等。
具体步骤如下:
```python
import pygetwindow as gw
获取当前活动窗口的信息
window = ()
print() 输出窗口标题
print() 输出窗口左侧位置
print() 输出窗口顶部位置
print() 输出窗口宽度
print() 输出窗口高度。
c#获取当前活动窗⼝句柄,获取窗⼝⼤⼩及位置需调⽤API函数需在开头引⼊命名空间using System.Runtime.InteropServices;获取当前窗⼝句柄:GetForegroundWindow()[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]public static extern IntPtr GetForegroundWindow();返回值类型是IntPtr,即为当前获得焦点窗⼝的句柄使⽤⽅法 : IntPtr myPtr=GetForegroundWindow();获取到该窗⼝句柄后,可以对该窗⼝进⾏操作.⽐如,关闭该窗⼝或在该窗⼝隐藏后,使其显⽰[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);其中ShowWindow(IntPtr hwnd, int nCmdShow);nCmdShow的含义0 关闭窗⼝1 正常⼤⼩显⽰窗⼝2 最⼩化窗⼝3 最⼤化窗⼝使⽤实例: ShowWindow(myPtr, 0);获取窗⼝⼤⼩及位置:需要调⽤⽅法GetWindowRect(IntPtr hWnd, ref RECT lpRect)[DllImport("user32.dll")][return: MarshalAs(UnmanagedType.Bool)]static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);[StructLayout(LayoutKind.Sequential)]public struct RECT{public int Left; //最左坐标public int Top; //最上坐标public int Right; //最右坐标public int Bottom; //最下坐标}⽰例:InPtr awin = GetForegroundWindow(); //获取当前窗⼝句柄RECT rect = new RECT();GetWindowRect(awin, ref rect);int width = rc.Right - rc.Left; //窗⼝的宽度int height = rc.Bottom - rc.Top; //窗⼝的⾼度int x = rc.Left;int y = rc.Top;------------------------------------------------------------------------C#中的FindWindow[System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint="FindWindow")]public static extern int FindWindow (string lpClassName,string lpWindowName);已知窗⼝标题"abc",怎么得到窗⼝句柄?IntPtr hWnd = FindWindow(null, "abc");-------------------------------------------------------C#使⽤FindWindow()函数:[DllImport("coredll.dll", EntryPoint = "FindWindow")]private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);这个函数有两个参数,第⼀个是要找的窗⼝的类,第⼆个是要找的窗⼝的标题。
易语言获取窗口信息的方法(一)易语言获取窗口信息的方法在易语言中,我们可以通过一些方法来获取窗口的信息。
下面是一些常用的方法和函数,供您参考。
方法一:使用窗口标题获取窗口句柄使用窗口标题可以获取到指定窗口的句柄(handle)。
以下是获取窗口句柄的函数:hwnd = 资源.查找窗口(窗口标题)将窗口标题替换为您要查找的窗口的标题。
该函数会返回一个窗口句柄,您可以将其保存在一个变量中以便后续使用。
方法二:使用窗口类名获取窗口句柄与方法一类似,您还可以通过窗口类名来获取窗口句柄。
以下是获取窗口句柄的函数:hwnd = 资源.查找窗口类(窗口类名)将窗口类名替换为您要查找的窗口的类名。
同样,该函数会返回一个窗口句柄。
获取窗口的位置和大小可以帮助我们确定窗口在屏幕上的位置以及窗口的大小。
以下是获取窗口位置和大小的函数:x, y, width, height = 资源.获取窗口位置和大小(hwnd)将 hwnd 替换为您要获取位置和大小的窗口的句柄。
函数会返回窗口的横坐标、纵坐标、宽度和高度,分别保存在 x、y、width 和height 变量中。
方法四:获取窗口的标题获取窗口的标题可以用于确认窗口的具体信息。
以下是获取窗口标题的函数:标题 = 资源.获取窗口标题(hwnd)将 hwnd 替换为您要获取标题的窗口的句柄。
函数会返回窗口的标题,保存在标题变量中。
方法五:获取窗口的进程ID获取窗口的进程ID可以用于确定窗口所属的进程。
以下是获取窗口进程ID的函数:进程ID = 资源.获取窗口进程ID(hwnd)将 hwnd 替换为您要获取进程ID的窗口的句柄。
函数会返回窗口所属的进程ID,保存在进程ID变量中。
获取窗口的父窗口句柄可以用于确定窗口的层次结构。
以下是获取窗口父窗口句柄的函数:父窗口句柄 = 资源.获取窗口父窗口句柄(hwnd)将 hwnd 替换为您要获取父窗口句柄的窗口的句柄。
函数会返回窗口的父窗口句柄,保存在父窗口句柄变量中。
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')。
如何通过句柄获取外部程序的窗口的内容要通过句柄获取外部程序的窗口内容,可以使用Windows API函数来实现。
具体步骤如下:
1. 使用Windows API函数`FindWindow`或`FindWindowEx`来查找目标窗口的句柄。
`FindWindow`可以根据窗口类名或窗口标题查找句柄,`FindWindowEx`可以根据父窗口句柄和窗口类名查找句柄。
如果获取到了目标窗口的句柄,继续下一步;否则,表示未找到目标窗口。
2. 使用Windows API函数`GetWindowTextLength`和
`GetWindowText`来获取目标窗口的文本内容。
`GetWindowTextLength`用于获取文本内容的长度,`GetWindowText`用于获取实际文本内容。
可以先使用`GetWindowTextLength`来获取文本长度,然后创建一个对应长度的缓冲区,再使用`GetWindowText`来获取文本内容。
3. 可以使用其他Windows API函数来获取窗口的其他信息,如
`GetClassName`获取窗口的类名,`GetWindowRect`获取窗口的位置和大小等。
需要注意的是,使用Windows API函数需要导入`user32.dll`库,并且可以使用C++、C#、Python等编程语言进行开发。
使用不同编程语言,具体API函数的调用方式会有所差异。
读取外部程序的标题和内容Delphi 为我们提供了三个⽅便的函数:GlobalAllocPtr {简化⾃ API 的 GlobalAlloc}GlobalReAllocPtr {简化⾃ API 的 GlobalReAlloc}GlobalFreePtr {简化⾃ API 的 GlobalFree}读写本程序以外的数据时可以使⽤它们, 很⽅便, 譬如:p := GlobalAllocPtr(0, Len); {分配}p := GlobalReAllocPtr(p, Len, 0); {重分配}GlobalFreePtr(p); {释放}注意 GlobalAllocPtr 的第⼀个参数和 GlobalReAllocPtr 的最后⼀个参数, 上⾯给的都是 0;这两个参数的意义是⼀样的, 规范⼀点应该写成 GMEM_FIXED (表⽰分配固定内存), 常⽤的参数还有:GMEM_MOVEABLE {分配可移动内存}GMEM_ZEROINIT {同时清空内存}GHND {分配可移动内存同时清空}GPTR {分配固定内存同时清空}procedure TForm1.Button2Click(Sender: TObject);varp: Pointer;Len: Integer;beginLen := 6+1; {假如想要读出 6 个字符, 要流出结束的空字符}p := GlobalAllocPtr(0, Len*2); {分配内存 Len*2 是针对双字节字符}SendMessage(Memo1.Handle, WM_GETTEXT, Len, Cardinal(p));ShowMessage(PChar(p)); {CodeGe}{在上⼀例的基础上继续, 先获取实际长度}Len := SendMessage(Memo1.Handle, WM_GETTEXTLENGTH, 0, 0);Len := (Len + 1) * 2;p := GlobalReAllocPtr(p, Len, GHND); {重新分配内存}SendMessage(Memo1.Handle, WM_GETTEXT, Len, Cardinal(p));ShowMessage(PChar(p)); {CodeGear Delphi 2009}GlobalFreePtr(p);end;{获取已打开的所有记事本的标题}procedure TForm1.Button1Click(Sender: TObject);varh: HWnd;p: array[0..254] of char;beginMemo1.Clear;h := GetWindow(Handle, GW_HWNDFIRST);while h <> 0dobeginGetClassName(h, p, Length(p));if p = 'Notepad'thenbeginGetWindowText(h, p, Length(p));Memo1.Lines.Add(p);end;h := GetWindow(h, GW_HWNDNEXT);end;end;--------------- 读取记事本的标题 ----------------------------------procedure TForm1.Button1Click(Sender: TObject);varp: Pointer;Len: Integer;h:hwnd;beginh:=findwindow('notepad',nil);Len := 6+1; {假如想要读出 6 个字符, 要留出结束的空字符}p := GlobalAllocPtr(0, Len*2); {分配内存 Len*2 是针对双字节字符}SendMessage(h, WM_GETTEXT, Len, Cardinal(p));ShowMessage(PChar(p)); {CodeGe}GlobalFreePtr(p);end;--------------- 读取记事本的内容 ----------------------------------procedure TForm1.Button1Click(Sender: TObject);varh: HWND;p: Pointer;Len: Integer;beginh := FindWindow('Notepad', nil);if h = 0then Exit;h := GetWindow(h, GW_CHILD);if h = 0then Exit;Len := SendMessage(h, WM_GETTEXTLENGTH, 0, 0) + 1;p := GlobalAllocPtr(0, Len * SizeOf(Char));SendMessage(h, WM_GETTEXT, Len, Cardinal(p));ShowMessage(PChar(p));GlobalFreePtr(p);end;//声明:GetWindow(hWnd: HWND; {指定的窗⼝句柄}uCmd: UINT {指定的关系选项}): HWND; {失败返回0; 成功返回符合的窗⼝句柄}//uCmd 可选值:GW_HWNDFIRST = 0; {同级别第⼀个}GW_HWNDLAST = 1; {同级别最后⼀个}GW_HWNDNEXT = 2; {同级别下⼀个}GW_HWNDPREV = 3; {同级别上⼀个}GW_OWNER = 4; {属主窗⼝}GW_CHILD = 5; {⼦窗⼝}{要有个 Memo 接受数据}procedure TForm1.Button1Click(Sender: TObject);varh: HWnd;p: array[0..254] of char;beginh := GetWindow(Handle, GW_HWNDFIRST);while h <> 0dobeginif GetWindowText(h, p, 255) > 0then Memo1.Lines.Add(p);h := GetWindow(h, GW_HWNDNEXT);end;end;{⽤ API 实现的获取⽂本容器中选择的⽂本的函数}function GetEditSeleteText(h: HWND): string;varlen,sx,ex: Integer; {⽂本总长度, 选择的开始位置, 选择的结束位置}buf: PChar; {所有⽂本}begin{获取⽂本总长度}len := SendMessage(h, WM_GETTEXTLENGTH, 0, 0) + 1;{为接受所有⽂本的缓冲区分配内存}buf := GlobalAllocPtr(0, len); {这⾥没有使⽤ GetMem, 因为需要全局的, 不然⽆法⾯对其他程序} {获取所有⽂本}SendMessage(h, WM_GETTEXT, len, Longint(buf));{获取选择的开始位置和结束位置}SendMessage(h, EM_GETSEL, Longint(@sx), Longint(@ex));{截取选择的⽂本}Result := Copy(buf, sx+1, ex-sx);{释放内存}GlobalFreePtr(buf);end;{测试 TEdit, 同时与 VCL 的获取⽅法对⽐}procedure TForm1.Button1Click(Sender: TObject);beginShowMessage(GetEditSeleteText(Edit1.Handle) + ' - ' + Edit1.SelText);end;varh: HWND;procedure TForm1.Timer1Timer(Sender: TObject);varpt: TPoint;arr: array[0..254] of Char;beginif GetCursorPos(pt) then{如果能获取点}beginh := WindowFromPoint(pt); {返回句柄}GetClassName(h, arr, Length(arr)); {获取该句柄窗⼝的类名}Text := arr; {显⽰在标题}end;end;end.//声明:GetClassName(hWnd: HWND; {指定窗⼝句柄}lpClassName: PChar; {缓冲区}nMaxCount: Integer {缓冲区⼤⼩}): Integer; {返回类名⼤⼩; 失败返回 0}//测试1: 新建⼀个⼯程, 主窗⼝的类名默认是 TForm1, ⽤程序获取⼀下看看varps: array[0..254] of Char;beginGetClassName(Handle, ps, 255);ShowMessage(ps); {TForm1}end;//测试2: 看看 "计算器" 窗⼝的类名(先启动计算器)varh: HWND;ps: array[0..254] of Char;beginh := FindWindow(nil, '计算器'); {这句是获取计算器窗⼝的句柄}GetClassName(h, ps, 255);ShowMessage(ps); {SciCalc}end;//测试3: 看看记事本窗⼝的类名(先重新启动记事本):varh: HWND;ps: array[0..254] of Char;beginh := FindWindow(nil, '⽆标题 - 记事本'); {这句是获取记事本窗⼝的句柄}GetClassName(h, ps, 255);ShowMessage(ps); {Notepad}end;FindWindow(lpClassName, {窗⼝的类名}lpWindowName: PChar {窗⼝的标题}): HWND; {返回窗⼝的句柄; 失败返回 0}//FindWindowEx ⽐ FindWindow 多出两个句柄参数:FindWindowEx(Parent: HWND; {要查找⼦窗⼝的⽗窗⼝句柄}Child: HWND; {⼦窗⼝句柄}ClassName: PChar; {}WindowName: PChar {}): HWND;{如果 Parent 是 0, 则函数以桌⾯窗⼝为⽗窗⼝, 查找桌⾯窗⼝的所有⼦窗⼝;如果是 HWND_MESSAGE, 函数仅查找所有消息窗⼝;⼦窗⼝必须是 Parent 窗⼝的直接⼦窗⼝;如果 Child 是 0, 查找从 Parent 的第⼀个⼦窗⼝开始;如果 Parent 和 Child 同时是 0, 则函数查找所有的顶层窗⼝及消息窗⼝.}//测试1: 试着找找新建程序主窗⼝的句柄varh: HWND;begin{现在我们知道窗⼝的标题是: Form1、窗⼝的类名是: TForm1}h := FindWindow('TForm1', 'Form1');ShowMessage(IntToStr(h)); {656180; 这是随机, 每次启动窗⼝肯定不⼀样} {假如不知道类名}h := FindWindow(nil, 'Form1');ShowMessage(IntToStr(h)); {656180}{假如不知道标题名}h := FindWindow('TForm1', nil);ShowMessage(IntToStr(h)); {656180}{其实这个窗⼝的句柄不就是 Self.Handle 吗}ShowMessage(IntToStr(Handle)); {656180}end;//测试2: 找计算器窗⼝的句柄(先打开计算器)varh: HWND;begin{如果不是简体中⽂系统, 这样可能不灵}h := FindWindow(nil, '计算器');ShowMessage(IntToStr(h)); {1508334}{最好这样, 但你得提前知道计算器窗⼝的类名是: SciCalc}h := FindWindow('SciCalc', nil);ShowMessage(IntToStr(h)); {1508334}end;procedure TForm1.Button1Click(Sender: TObject);constclassName = 'IEFrame'; {这是 IE 浏览器的类名}varh: HWnd;buf: array[Byte] of Char;beginh := GetWindow(Handle, GW_HWNDFIRST);while h <> 0dobeginGetClassName(h, buf, Length(buf));if buf = className then{找到咋处理? 显⽰它的标题吧}beginGetWindowText(h, buf, Length(buf));Memo1.Lines.Add(buf)end;h := GetWindow(h, GW_HWNDNEXT);end;end;procedure TForm1.Button1Click(Sender: TObject);constclassName = 'IEFrame'; {这是 IE 浏览器的类名}varh: HWnd;buf: array[Byte] of Char;beginh := GetWindow(Handle, GW_HWNDFIRST);while h <> 0dobeginGetClassName(h, buf, Length(buf));if buf = className then{找到咋处理? 显⽰它的标题吧}beginGetWindowText(h, buf, Length(buf));Memo1.Lines.Add(buf)end;h := GetWindow(h, GW_HWNDNEXT);end;end;如果有个按钮,是disabled那种效果,就是灰掉,不能点的那种,怎么获取这样按钮句柄呢?可以从母体中遍历控件找到它.如果是使⽤⿏标探测的话, 可以通过判断⿏标指针是否在控件范围内来确认.怎么判断⿏标指针是否在控件范围内?可以通过控件的事件:OnMouseEnter (进⼊控件范围)OnMouseLeave (离开控件范围)也可以⽤函数: PtInRect。
通过句柄查找文本框的方法
1.首先,获取需要查找文本框的句柄。
句柄是操作系统为每
个窗口分配的唯一标识符,可以用来定位和操作窗口。
2.使用句柄调用相应的API函数来查找文本框。
Windows
操作系统提供了一系列函数来操作窗口,其中包括查找窗口的
函数。
3.通过API函数进行句柄的查找。
Windows提供了
`FindWindow`、`FindWindowEx`等函数用于在当前活动的
窗口中查找指定的窗口或控件。
这些函数需要提供相应的参数,如窗口类名、窗口标题等。
4.一旦找到了需要的窗口句柄,可以使用句柄来进行后续操作。
对于文本框,可以调用相应的API函数来获取或设置文本
框的内容。
例如,可以使用`SendMessage`函数发送
`WM_GETTEXT`消息来获取文本框中的文本内容,或者使用
`SendMessage`函数发送`WM_SETTEXT`消息来设置文本框
的内容。
需要注意的是,不同的编程语言和操作系统平台对于句柄的
处理方式可能会略有不同,具体的实现方式可能会有所差异。
在具体的开发环境中,可以根据相应的文档或API文档来了解
具体的函数和参数的使用方法。
按键精灵可以通过使用句柄来获取窗口、控件等对象的引用,进而进行操作。
以下是使用句柄的示例:
1. 获取窗口句柄:
```csharp
Hwnd = Plugin.Window.Find("类名", "标题名")
```
其中,“类名”和“标题名”分别代表目标窗口的类名和标题。
如果找到了目标窗口,则返回窗口句柄;否则返回0。
2. 获取子窗口句柄:
```csharp
HwndEx = Plugin.Window.FindEx(Hwnd, 0, "子窗口类名", "子窗口标题")
```
其中,`Hwnd`是父窗口的句柄,“子窗口类名”和“子窗口标题”分别代表子窗口的类名和标题。
如果找到了子窗口,则返回子窗口句柄;否则返回0。
3. 使用句柄进行操作:
```csharp
Call Plugin.Window.Min(Hwnd) '最小化窗口
Delay 500 '等待500毫秒
Call Plugin.Bkgnd.LeftClick(HwndEx, 475, 574) '在子窗口左上角点击鼠标左键
```
其中,`Plugin.Window.Min(Hwnd)`表示将目标窗口最小化;`Delay 500`表示等待500毫秒;`Plugin.Bkgnd.LeftClick(HwndEx, 475, 574)`表示在子窗口左上角点击鼠标左键。
以上示例仅供参考,实际使用时需要根据具体情况进行调整。
如何通过句柄获取外部程序的窗口的内容Option Explicit'常数申明Public Const LVM_FIRST As Long = &H1000Public Const LVM_GETHEADER As Long = LVM_FIRST + 31 Public Const LVM_GETITEMCOUNT As Long = LVM_FIRST + 4Public Const LVM_GETITEMTEXT As Long = LVM_FIRST + 45 Public Const HDM_FIRST As Long = &H1200Public Const HDM_GETITEMCOUNT As Long = (HDM_FIRST + 0)Public Const PROCESS_VM_OPERATION As Long = &H8Public Const PROCESS_VM_READ As Long = &H10Public Const PROCESS_VM_WRITE As Long = &H20Public Const MAX_LVMSTRING As Long = 255Public Const MEM_COMMIT As Long = &H1000Public Const MEM_RELEASE As Long = &H8000&Public Const PAGE_READWRITE As Long = &H4Public Const LVIF_TEXT As Long = &H1'类型申明Public Type LV_ITEMAmask As LongiItem As LongiSubItem As LongState As LongstateMask As LongpszText As LongcchTextMax As LongEnd Type'API申明Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long '打开进程Public Declare Function VirtualAllocEx Lib "kernel32" (ByVal hProcess As Long, ByVal lpAddress As Long, ByVal dwSize As Lo ng, ByVal flAllocationType As Long, _ByVal flProtect As Long) As Long '获取内存空间Public Declare Function VirtualFreeEx Lib "kernel32" (ByVal hProcess As Long, ByVal lpAddress As Long, ByVal dwSize As Lo ng, ByVal dwFreeType As Long) As Long '释放内存空间Public Declare Function WriteProcessMemory Lib "kernel32 " (ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByRef l pBuffer As LV_ITEMA, ByVal nSize As Long, _lpNumberOfBytesWritten As Long) As Long '向内存写数据Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByRef l pBuffer As Any, ByVal nSize As Long, _lpNumberOfBytesWritten As Long) As Long '向内存读数据Public Declare Function SendMessage Lib "user32" Alias "Se ndMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long '发送消息Public Declare Function CloseHandle Lib "kernel32" (ByVal h Object As Long) As Long '关闭进程Public Declare Function GetWindowThreadProcessId Lib "us er32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long '获得进程IDPublic Function GetListViewTextArray(ByVal hWindow As Lo ng) As String()Dim myItem() As LV_ITEMADim PHandle As LongDim ProcessId As LongDim PStrBufferMemory As LongDim PMyItemMemory As LongDim StrBuffer(MAX_LVMSTRING) As ByteDim TmpString As StringDim Ih As Long, J As Long, HCount As LongDim StrArr() As String, ItemString As StringDim Ji As Long, MyItemLength() As LongGetWindowThreadProcessId hWindow, ProcessIdHCount = SendMessage(hWindow, LVM_GETHEADER, 0, 0) '获取列数If HCount > 0 ThenHCount = SendMessage(HCount, HDM_GETITEMCOUNT, 0, 0) - 1Else 'NOT HCOUNT...HCount = 0End IfPHandle = OpenProcess(PROCESS_VM_OPERATION Or PRO CESS_VM_READ Or PROCESS_VM_WRITE, 0, ProcessId) ReDim myItem(HCount)ReDim MyItemLength(HCount)PStrBufferMemory = VirtualAllocEx(PHandle, 0, MAX_LVMS TRING, MEM_COMMIT, PAGE_READWRITE)PMyItemMemory = VirtualAllocEx(PHandle, 0, MAX_LVMST RING, MEM_COMMIT, PAGE_READWRITE)Ji = SendMessage(hWindow, LVM_GETITEMCOUNT, 0, 0) - 1 On Error GoTo err1ReDim StrArr(Ji)For Ih = 0 To HCountmyItem(Ih).mask = LVIF_TEXTmyItem(Ih).iSubItem = IhmyItem(Ih).pszText = PStrBufferMemorymyItem(Ih).cchTextMax = MAX_LVMSTRINGMyItemLength(Ih) = Len(myItem(Ih))Next IhFor J = 0 To JiItemString = ""For Ih = 0 To HCountWriteProcessMemory PHandle, PMyItemMemory, myItem(I h), MyItemLength(Ih), 0If SendMessage(hWindow, LVM_GETITEMTEXT, J, ByVal PMy ItemMemory) > 0 ThenReadProcessMemory PHandle, PStrBufferMemory, StrBuffer (0), MAX_LVMSTRING, 0TmpString = StrConv(StrBuffer, vbUnicode)TmpString = Left(TmpString, InStr(TmpString, vbNullChar) - 1)ItemString = ItemString & TmpString & Chr(9) ' Chr$(32)End IfNext IhIf ItemString <> "" ThenStrArr(J) = Left(ItemString, Len(ItemString) - 1)End IfNext JVirtualFreeEx PHandle, PMyItemMemory, 0, MEM_RELEASE VirtualFreeEx PHandle, PStrBufferMemory, 0, MEM_RELEASECloseHandle (PHandle)ItemString = ""GetListViewTextArray = StrArrExit Functionerr1:MsgBox "不是Listview类吧?", vbInformation End Function上面是vb6的模块,你对照转换下。
qt 用句柄获取界面数据的函数【最新版】目录1.QT 用句柄获取界面数据的函数概述2.句柄的概念与作用3.获取界面数据的函数分类与使用方法4.注意事项与示例代码正文一、QT 用句柄获取界面数据的函数概述在 QT 开发中,获取界面数据的函数主要通过句柄(Handle)来实现。
句柄是 QT 对象的一个唯一标识符,通过对象的句柄可以方便地获取和操作界面上的控件数据。
本文将详细介绍如何使用句柄获取界面数据的函数。
二、句柄的概念与作用句柄是 QT 对象的一个内部数据结构,用于唯一标识一个对象。
在 QT 中,每个对象都有一个对应的句柄,通过句柄可以访问和操作对象。
句柄的作用主要体现在以下几个方面:1.便于对象的访问和操作:通过对象的句柄,可以方便地访问和操作对象,提高了代码的可读性和可维护性。
2.对象的唯一标识:句柄作为对象的唯一标识,可以确保对象的唯一性,避免了重复创建和操作对象。
3.对象的动态创建和删除:通过句柄,可以在运行时动态创建和删除对象,方便了程序的动态调整。
三、获取界面数据的函数分类与使用方法在 QT 中,获取界面数据的函数主要分为以下几类:1.QWidget 类:QWidget 类是 QT 的顶层窗口类,其包含了获取界面数据的基本函数。
- qobject_cast():通过类名和句柄,将句柄转换为指定类的对象指针。
- findChild():通过控件名称,查找子窗口或控件。
- findChildren():查找子窗口或控件,返回一个 QListWidget 对象。
2.QWidget 子类:QWidget 的子类也包含了一些获取界面数据的函数。
例如 QLabel 类:- text():获取标签显示的文本内容。
- setText():设置标签显示的文本内容。
3.使用注意事项:- 在使用 qobject_cast() 时,需要确保句柄所指向的对象是目标类的实例。
- 在使用 findChild() 和 findChildren() 时,需要确保控件的名称唯一。
取句柄编辑框选中文本的方法说实话取句柄编辑框选中文本的方法这事,我一开始也是瞎摸索。
我最开始的时候就很头大,都不知道从哪儿下手。
我就先到处查资料,看到有人说要从窗口相关的函数找起,就像在一个大仓库里找东西,你得先确定找东西的大致区域。
我就试着用FindWindow函数去找包含这个编辑框的窗口句柄,这一步就像是先找到装东西的大箱子。
但是光是找到窗口句柄还不够啊。
我之前就搞错了,还以为找到窗口句柄就完事了,结果怎么也选不中编辑框里的文本。
后来才知道得再通过这个窗口句柄找到编辑框的子句柄才行。
这就好比大箱子里有小盒子,你得把小盒子找出来。
我用EnumChildWindows函数去遍历子窗口,这里就特别容易出错。
我有一次就很马虎,参数设置得不对,都没法正确遍历,找了好久才发现错误。
找到编辑框句柄之后,要选中文本的话,不同的编程环境有不同的方法。
比如在Windows环境下,如果是用Win32 API,我试过SendMessage这个函数。
你可以想象它就像一个邮差,带着你的消息去找接收者。
我给发送的消息是EM_SETSEL,这个消息就好像告诉编辑框我要选择哪块文本了,我得指定起始位置和结束位置的参数,这有点像告诉邮差要去的准确地址一样。
我最开始不确定参数咋整,就瞎试了好多数字组合,好多都不对,不是选错了部分文本就是啥也没选中。
后来慢慢才明白要根据编辑框里文本的实际情况来确定这些参数。
另外我也试过一些编程框架提供的简化方法。
比如某些特定的UI框架会把这个取句柄选中文本的操作封装起来,有现成的函数可以调用,但这个也得先保证你把前面找到句柄那部分做好,就像盖房子得先打好地基一样,不然那现成函数也没法正常工作。
这就是我在摸索取句柄编辑框选中文本方法的一些经历啦。
还有就是在实际编程测试的时候,得不停改动代码看结果,这个过程可不能偷懒。
就比如说修改那个SendMessage函数的参数,就得多试试不同的值,才能掌握其中的门道。
qt 用句柄获取界面数据的函数摘要:1.介绍句柄的概念2.阐述如何使用句柄获取界面数据3.演示获取界面数据的函数实现4.总结使用句柄获取界面数据的方法和注意事项正文:在计算机编程中,句柄(Handle)是一种用于标识某个对象或资源的标识符。
在界面编程中,句柄通常用于获取和操作界面元素的数据。
本文将介绍如何使用句柄获取界面数据,以及一个示例函数。
首先,我们需要了解如何在程序中为界面元素分配句柄。
在许多编程语言和库中,创建界面元素时,系统会自动为其分配一个唯一的句柄。
此后,我们可以通过这个句柄来获取和操作该界面元素的相关数据。
接下来,我们来看如何使用句柄获取界面数据。
以下是一个简单的示例,演示如何使用句柄获取一个文本框(TextBox)的文本内容。
假设我们有一个名为`GetTextData`的函数,它接受一个句柄作为参数,并返回文本框的文本内容。
```cppstring GetTextData(HWND hWnd) {// 获取文本框的文本长度int textLength = GetWindowTextLength(hWnd);// 分配内存存储文本内容char* textBuffer = new char[textLength + 1];// 获取文本框的文本内容GetWindowText(hWnd, textBuffer, textLength + 1);// 删除分配的内存delete[] textBuffer;// 返回文本内容return textBuffer;}```在这个示例中,我们首先使用`GetWindowTextLength`函数获取文本框的文本长度。
然后,我们分配一块内存用于存储文本内容。
接下来,使用`GetWindowText`函数获取文本框的文本内容,并将其存储在分配的内存中。
最后,我们删除分配的内存,并返回文本内容。
在使用句柄获取界面数据时,请注意以下几点:1.确保正确获取句柄。
如何通过句柄获取外部程序的窗口的内容Option Explicit'常数申明Public Const LVM_FIRST As Long = &H1000Public Const LVM_GETHEADER As Long = LVM_FIRST + 31Public ConstLVM_GETITEMCOUNT As Long = LVM_FIRST + 4Public Const LVM_GETITEMTEXT As Long = LVM_FIRST +45Public Const HDM_FIRST As Long =&H1200Public Const HDM_GETITEMCOUNT As Long = (HDM_FIRST + 0)Public ConstPROCESS_VM_OPERATION As Long = &H8Public Const PROCESS_VM_READ As Long = &H10Public Const PROCESS_VM_WRITE As Long = &H20Public Const MAX_LVMSTRING As Long = 255Public Const MEM_COMMIT As Long = &H1000Public Const MEM_RELEASE As Long = &H8000&Public Const PAGE_READWRITE As Long = &H4Public Const LVIF_TEXT As Long = &H1'类型申明Public Type LV_ITEMA mask As Long iItemAs Long iSubItem As Long State As Long stateMask As Long pszText As Long cchTextMax As LongEnd Type'API申明PublicDeclare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long '打开进程Public Declare Function VirtualAllocEx Lib "kernel32" (ByVal hProcess As Long, ByVal lpAddress As Long, ByVal dwSize As Long, ByVal flAllocationType As Long, _ByVal flProtect As Long) As Long '获取内存空间Public Declare Function VirtualFreeEx Lib "kernel32" (ByVal hProcess As Long, ByVal lpAddress As Long, ByVal dwSize As Long, ByVal dwFreeType As Long) As Long '释放内存空间Public Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByRef lpBuffer As LV_ITEMA, ByVal nSize As Long, _lpNumberOfBytesWritten As Long) As Long '向内存写数据Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByRef lpBuffer As Any, ByVal nSize As Long, _lpNumberOfBytesWritten As Long) As Long '向内存读数据Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg AsLong, ByVal wParam As Long, ByRef lParam As Any) As Long '发送消息Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long '关闭进程Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long '获得进程IDPublic Function GetListViewTextArray(ByVal hWindow As Long) As String() Dim myItem() As LV_ITEMA Dim PHandleAs Long Dim ProcessId As Long Dim PStrBufferMemory As Long Dim PMyItemMemoryAs Long Dim StrBuffer(MAX_LVMSTRING) As ByteDim TmpString As String Dim Ih As Long, J As Long, HCount As Long Dim StrArr() As String, ItemString As String Dim Ji As Long, MyItemLength() As Long GetWindowThreadProcessId hWindow, ProcessId HCount = SendMessage(hWindow, LVM_GETHEADER, 0, 0) '获取列数If HCount > 0 Then HCount = SendMessage(HCount, HDM_GETITEMCOUNT, 0, 0) - 1 Else 'NOT HCOUNT... HCount = 0 End If PHandle = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, 0, ProcessId) ReDim myItem(HCount) ReDimMyItemLength(HCount) PStrBufferMemory = VirtualAllocEx(PHandle, 0, MAX_LVMSTRING,MEM_COMMIT, PAGE_READWRITE)PMyItemMemory = VirtualAllocEx(PHandle, 0,MAX_LVMSTRING, MEM_COMMIT, PAGE_READWRITE) Ji = SendMessage(hWindow, LVM_GETITEMCOUNT, 0, 0) - 1 On Error GoTo err1 ReDim StrArr(Ji)For Ih = 0 To HCount myItem(Ih).mask =LVIF_TEXT myItem(Ih).iSubItem = IhmyItem(Ih).pszText = PStrBufferMemorymyItem(Ih).cchTextMax = MAX_LVMSTRING MyItemLength(Ih) = Len(myItem(Ih)) Next IhFor J = 0 To Ji ItemString = "" For Ih = 0 To HCount WriteProcessMemory PHandle, PMyItemMemory, myItem(Ih), MyItemLength(Ih), 0If SendMessage(hWindow, LVM_GETITEMTEXT, J, ByVal PMyItemMemory) > 0 ThenReadProcessMemory PHandle, PStrBufferMemory, StrBuffer(0), MAX_LVMSTRING, 0TmpString = StrConv(StrBuffer, vbUnicode)TmpString = Left(TmpString, InStr(TmpString, vbNullChar) - 1) ItemString = ItemString &TmpString & Chr(9) ' Chr$(32) End If Next Ih If ItemString <> "" ThenStrArr(J) = Left(ItemString, Len(ItemString) - 1)End If Next J VirtualFreeEx PHandle, PMyItemMemory, 0, MEM_RELEASE VirtualFreeEx PHandle, PStrBufferMemory, 0, MEM_RELEASE CloseHandle (PHandle) ItemString = "" GetListViewTextArray = StrArr Exit Functionerr1: MsgBox "不是Listview类吧?", vbInformationEnd Function。