1. 如何得到创建的word对象的句柄
The GetProcessHandleFromHwnd function retrieves a process handle from a window handle.
HANDLE WINAPI GetProcessHandleFromHwnd(
HWND hwnd,
);
这个函数通过窗口句柄获得进程句柄。有了进程句柄,PID是不是就知道怎么获得了?什么?不知道?那我告诉你,GetProcessId可以通过进程句柄获得进程ID:
DWORD WINAPI GetProcessId(
__in HANDLE Process
);
2. 如何使用FindWindowEx获取窗体内控件句柄
一般用FindWindow。
Delphi中获取其它进程的窗口句柄,在Delphi中获取其它进程的窗口句柄,绝大部分人首先想到的会使用:FindWindow或者用GetWindow来遍历查找,如: Delphi/Pascal code? handle := FindWindow(nil,PChar('窗口的标题')); 或者: Delphi/Pascal code? procedure TForm1.Button1Click(Sender: TObject); var hCurrentWindow: HWnd; WndText:String; begin hCurrentWindow := GetWindow(Handle, GW_HWNDFIRST); while hCurrentWindow <> 0 do begin WndText:=GetWndText(hCurrentWindow); if UpperCase(WndText)='窗口的标题' then begin 。 。
end; hCurrentWindow:=GetWindow(hCurrentWindow, GW_HWNDNEXT); end; end; 因为目前网络上绝大部分的代码都是介绍用这两种方法取得其它进程的窗口句柄。虽这两种方法都可以达到查找其它进程的窗口句柄的目的,但本人认为这两都方法存在较大的弊端。
因为这两种方法都是根据其它进程的标题来查找的,如果其它进程的标题在运行时不断的发生变化,那么这两种方法就无法没办法用了。 介绍第三种通过进程的文件名来查找窗口句柄。
首先通过进程快照得到要查找的进程ID(ProcessId),其次,再跟据ProcessId获取进程的窗口句柄。以下为本文章的代码: Delphi/Pascal code? uses TLHelp32; procedure TForm1.Button1Click(Sender: TObject); var ProcessName : string; //进程名 FSnapshotHandle:THandle; //进程快照句柄 FProcessEntry32:TProcessEntry32; //进程入口的结构体信息 ContinueLoop:BOOL; MyHwnd:THandle; begin FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //创建一个进程快照 FProcessEntry32.dwSize:=Sizeof(FProcessEntry32); ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32); //得到系统中第一个进程 //循环例举 while ContinueLoop do begin ProcessName := FProcessEntry32.szExeFile; if(ProcessName = '要找的应用程序名.exe') then begin MyHwnd := GetHWndByPID(FProcessEntry32.th32ProcessID); 。
。 end; ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32); end; CloseHandle(FSnapshotHandle); // 释放快照句柄 end; //跟据ProcessId获取进程的窗口句柄 function TForm1.GetHWndByPID(const hPID: THandle): THandle; type PEnumInfo = ^TEnumInfo; TEnumInfo = record ProcessID: DWORD; HWND: THandle; end; function EnumWindowsProc(Wnd: DWORD; var EI: TEnumInfo): Bool; stdcall; var PID: DWORD; begin GetWindowThreadProcessID(Wnd, @PID); Result := (PID <> EI.ProcessID) or (not IsWindowVisible(WND)) or (not IsWindowEnabled(WND)); if not Result then EI.HWND := WND; end; function FindMainWindow(PID: DWORD): DWORD; var EI: TEnumInfo; begin EI.ProcessID := PID; EI.HWND := 0; EnumWindows(@EnumWindowsProc, Integer(@EI)); Result := EI.HWND; end; begin if hPID<>0 then Result:=FindMainWindow(hPID) else Result:=0; end; 我说的是组件的句柄,不是窗体的句柄 findwindowex();获取指定句柄窗口下的子控件,当然是有句柄的控件 窗体的句柄都知道,还能不知道里面组件的句柄?——windows标准组件 procedure TForm1.Button2Click(Sender: TObject); var canvas1: TCanvas; begin Canvas1 := TCanvas.Create; //这是OK。
这真要感谢baidu,google canvas1.Handle := GetDc(panel1.Handle); canvas1.TextOut(1,1,'hello'); canvas1.Free ; Form1.Canvas.TextOut(10, 10, 'fff'); end; 有的组件是没有句柄的 ShowMessage(IntToStr(TWinControl(Form1.FindChildControl('Panel1')).Handle));。
3. 易语言FindwindowExA函数如何取所有句柄
如图所示,本函数在DLL命令中添加,数组所有子句柄保存所有组件句柄
易语言是一门计算机编程语言。以“易”著称,以中文作为程序代码表达的语言形式。易语言的创始人是吴涛。早期版本的名字为E语言。易语言最早的版本的发布可追溯至2000年9月11日。创造易语言的初衷是进行用中文来编写程序的实践。从2000年至今,易语言已经发展到一定的规模,功能上、用户数量上都十分可观。2015年计划推出移动版编程工具,用于编译安卓系统手机APP!
4. FindWindowExA 怎么找文本框的句柄
楼上诸位说得满多的,但是有一点没有提到
楼主是找DX游戏里面的子窗口句柄吗?如果是DX游戏里面的,一般来说是无法获得的,因为它的子窗口是画的,
首先下载一个spy++看看可不可以查到句柄,如果查不到,那就是画的窗口,没有句柄,如果可以找到,则代码如下
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Sub Command1_Click()
Dim MyHwnd
'如果窗口类名或者标题不能确定则参数设置为 vbNullString
'如果已知要找的子窗口位于某另一个子窗口之后,则把第2个参数 0 改为另一个子窗口句柄
MyHwnd = FindWindowEx(父窗口句柄, 0, 子窗口类名, 子窗口标题)
MsgBox MyHwnd
End Sub
5. C# FindWindowEx函数,可以获取得到文件另存为窗口的保存,取消
可以这样写:var hWnd = IntPtr.Zero; var hChild = IntPtr.Zero;// Find Save File Dialog Box while (hWnd == IntPtr.Zero) { Thread.Sleep(500); hWnd = FindWindow("#32770", "文件另存为"); } if (hWnd == IntPtr.Zero) return;// Enter fileName EnumChildWindows(hWnd, (handle, s) => { //####取标题 //StringBuilder title = new StringBuilder(100); //GetWindowText(handle, title, 100);//取标题 //if (title.ToString() == s) //{ // hChild = handle; // return false; //} //return true; //####取类型 StringBuilder type = new StringBuilder(100); GetClassName(handle, type, 100);//取类型 if (type.ToString() == s) { hChild = handle; return false; } return true; }, "Edit"); SendMessage(hChild, WM_SETTEXT, null, "c:\\文件名.xps");// Press Save button hChild = FindWindowEx(hWnd, IntPtr.Zero, "Button", "保存(&S)"); PostMessage(hChild, WM_IME_KEYDOWN, (int)Keys.S, 0); PostMessage(hChild, WM_IME_KEYUP, (int)Keys.S, 0);这些是上面用的函数:[DllImport("User32.dll")] public static extern int GetWindowText(IntPtr WinHandle, StringBuilder Title, int size); [DllImport("user32.dll")] public static extern int GetClassName(IntPtr WinHandle, StringBuilder Type, int size); public delegate bool EnumChildWindow(IntPtr WindowHandle, string num); [DllImport("User32.dll")] public static extern int EnumChildWindows(IntPtr WinHandle, EnumChildWindow ecw, string name); [DllImport("User32.dll", EntryPoint = "PostMessage")] private static extern int PostMessage(IntPtr hWnd, int Msg, string wParam, string lParam); [DllImport("User32.dll", EntryPoint = "SendMessage", SetLastError = true)] private static extern int SendMessage(IntPtr hWnd, int WM_CHAR, int wParam, int lParam); [DllImport("User32.dll", EntryPoint = "SendMessage", SetLastError = true)] private static extern int SendMessage(IntPtr hWnd, int WM_CHAR, string wParam, string lParam); [DllImport("user32.dll", EntryPoint = "FindWindow")] private extern static IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", EntryPoint = "FindWindowEx")] private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); [DllImport("User32.dll", EntryPoint = "PostMessage")] private static extern int PostMessage(IntPtr hWnd, int Msg, int wParam, int lParam);这些是用到的常量:private const int WM_KEYDOWN = 0x0100; private const int WM_IME_KEYDOWN = 0x0290; private const int WM_IME_KEYUP = 0x0291; private const int WM_SETTEXT = 0x000C;我这里测试已经通过了,你可以试试。
6. vc/MFC 为什么用FindWindowEX得不到句柄
FindWindowEx
函数功能
在窗口列表中寻找与指定条件相符的第一个子窗口 。
该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。
参数;
(1)hwndParent:要查找的子窗口所在的父窗口的句柄(如果设置了hwndParent,则表示从这个hwndParent指向的父窗口中搜索子窗口)。
如果hwndParent为 0 ,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。
Windows NT5.0 and later:如果hwndParent是HWND_MESSAGE,函数仅查找所有消息窗口。
(2)hwndChildAfter :子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndParent窗口的直接子窗口而非后代窗口。如果HwndChildAfter为NULL,查找从hwndParent的第一个子窗口开始。如果hwndParent 和 hwndChildAfter同时为NULL,则函数查找所有的顶层窗口及消息窗口。
(3)lpszClass:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位,必须位于lpClassName的低16位,高位必须为0。
(4)lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。
返回值
Long,找到的窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError
如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。如果函数失败,返回值为NULL。
若想获得更多错误信息,请调用GetLastError函数。
转载请注明出处51数据库 » findwindowex获取word句柄