Handel hwnd有什么区别? ( 积分: 19 )

  • 主题发起人 主题发起人 findwo
  • 开始时间 开始时间
F

findwo

Unregistered / Unconfirmed
GUEST, unregistred user!
或者说如何通过如下途径获得hwnd?<br>1、handel<br>2、processid<br>3、或者进程名称?<br>就这么多分了,我已经破产了[:(]
 
或者说如何通过如下途径获得hwnd?<br>1、handel<br>2、processid<br>3、或者进程名称?<br>就这么多分了,我已经破产了[:(]
 
Handel是什么?<br><br>HWND = type Longword<br>Longword 是32位无符号整数范围是(0..4294967295)<br>THandle = Integer<br>Integer 是32位有符号整数范围是(-2147483648..2147483647)
 
1、基本没有区别,都是 LongWord 类型的,窗口句柄一般用 HWND,而进程 ID 一般用 THandle,仅此而已。楼上的答案有点小错误。<br>2、你的问题提的不太清楚,通过进程 ID 获得窗口句柄还没有尝试过。不过我写过一个创建进程并取得主窗口句柄的例子,你可以看看:<br>(*<br> &nbsp;将外部程序主窗口嵌入到我的程序中<br> &nbsp;lpApplicationName: 外部程序名;<br> &nbsp;lpClassName: 嵌入窗口类名(可选 nil);<br> &nbsp;lpWindowName: 嵌入窗口标题(可选 nil);<br> &nbsp;hWndParent: 容器句柄;<br>*)<br>function EmbedWindow(lpApplicationName, lpClassName, lpWindowName: PChar;<br> &nbsp;hWndParent: HWND): THandle;<br>const<br> &nbsp;XSPACE = 5;<br> &nbsp;YSPACE = 5;<br>var<br> &nbsp;lpStartupInfo: _STARTUPINFOA;<br> &nbsp;lpProcessInfo: _PROCESS_INFORMATION;<br> &nbsp;hWndChild: HWND;<br> &nbsp;lpRect: TRect;<br>begin<br> &nbsp;FillChar(lpStartupInfo, SizeOf(lpStartupInfo), 0);<br> &nbsp;lpStartupInfo.cb := SizeOf(StartupInfo);<br> &nbsp;CreateProcess(lpApplicationName, nil, nil, nil, False, DETACHED_PROCESS,<br> &nbsp; &nbsp;nil, nil, lpStartupInfo, lpProcessInfo);<br> &nbsp;Result := lpProcessInfo.hProcess;<br> &nbsp;if Result &lt;&gt; 0 then<br> &nbsp;begin<br> &nbsp; &nbsp;WaitForInputIdle(Result, INFINITE);<br> &nbsp; &nbsp;hWndChild := 0;<br> &nbsp; &nbsp;while hWndChild = 0 do<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;hWndChild := FindWindow(lpClassName, lpWindowName);<br> &nbsp; &nbsp; &nbsp;Application.ProcessMessages;<br> &nbsp; &nbsp;end;<br> &nbsp; &nbsp;Windows.SetParent(hWndChild, hWndParent);<br> &nbsp; &nbsp;SetWindowLong(hWndChild, GWL_STYLE, GetWindowLong(hWndChild, GWL_STYLE) and<br> &nbsp; &nbsp; &nbsp;not WS_CAPTION and not WS_BORDER);<br> &nbsp; &nbsp;SetWindowPos(hWndChild, HWND_TOP, XSPACE, YSPACE, 0, 0, SWP_NOSIZE);<br> &nbsp; &nbsp;GetWindowRect(hWndChild, lpRect);<br> &nbsp; &nbsp;SetWindowPos(hWndParent, HWND_TOP, 0, 0,<br> &nbsp; &nbsp; &nbsp;lpRect.Right - lpRect.Left + XSPACE * 2,<br> &nbsp; &nbsp; &nbsp;lpRect.Bottom - lpRect.Top + YSPACE * 2, SWP_NOMOVE);<br> &nbsp;end;<br>end;
 
handel<br>和<br>hwnd<br>是代表不同含义的,这个已经测试证实。<br>但是如何通过handel获得hwnd?
 
如何通过handle得到hwnd?两种类型是兼容的,一种是有符号另外一种是无符号的。直接转换即可<br>var<br> &nbsp;FormHWND: HWND;<br> &nbsp;FormHandle: THandle;<br>begin<br> &nbsp;FormHWND := 1024;<br> &nbsp;FormHandle := 2048;<br> &nbsp;FormHWND := HWND(FormHandle);//反过来也可以 FormHandle := THandle(FormHWND);<br> &nbsp;ShowMessage(IntToStr(HWND));<br>end;
 
所有的HANDLE类型都是兼容的<br>HANDLE<br>HWND<br>HINSTANCE<br>HBITMAP<br>HDC<br>...<br>系统通过“句柄”来标识一切对象,而不管它是什么<br>所以第一种就是没什么特定类型的<br>不存在通过HANDLE取得HWND的情况,因为HWND本来就是HANDLE of WND<br>要不就是你的HANDLE指的是进程或线程句柄或其他什么对象的句柄
 
就是进程或线程句柄<br>怎么办呢?
 
到底是线程进程句柄都无所谓,他们都是一个数字标识符而已,具体定义是windows自己决定和分析的.比如有函数要进程句柄,你传给它进程句柄就可以了,没必要今晨根据部或者线程句柄怎么办!你像怎么办就怎么办.函数要求你怎么办就怎么办.
 
简单说.你自己也可以定义一个界面句柄,用integer表示,自己维护一个列表,当传进来某个数值的时候,查询列表,并对请求做相应操作.这就是windows自己的句柄维护机制!
 
通过进程句柄或线程句柄是不大可能直接获得窗口句柄的<br><br>反过来,通过窗口句柄却能够获得进程和线程的ID(注意不是HANDLE)<br>通过进程ID进一步可以得到进程句柄(线程句柄是拿不到的)<br><br>可能你须要EnumWindows,得到所有窗口句柄<br>如果你有进程句柄,可以拿来逐个比较<br>最好是直接用ID来比较<br>可以得出对应进程的主窗口
 
后退
顶部