
如果窗口是现有程序的,使用VS自带的spy++获取窗口的相关信息,然後使用WinAPI获取句柄,具体参考spy++的使用方法和winapi的使用
FindWindow(
lpClassName, {窗口的类名}
lpWindowName: PChar {窗口的标题}
): HWND; {返回窗口的句柄; 失败返回 0}
//FindWindowEx 比 FindWindow 多出两个句柄参数:
FindWindowEx(
Parent: HWND; {要查找子窗口的父窗口句柄}
Child: HWND; {子窗口句柄}
ClassName: PChar; {}
WindowName: PChar {}
): HWND;
如果窗口是你的程序动态生成的,使用如下语句
Form _FORM=new Form();
IntPtr _P = _FORMHandle;
_P就是你实例化的窗口句柄
用注册热键吧`-
-
F1开始,停止
版本
2
支持库
shellEx
支持库
eAPI
子程序
__启动窗口_创建完毕
注册热键
(_启动窗口取窗口句柄
(),
标签1取窗口句柄
(),
0,
#F1键)
子程序
_标签1_反馈事件,
整数型
参数
参数一,
整数型
参数
参数二,
整数型
判断开始
(时钟1时钟周期
=
100)
时钟1时钟周期
=
0
默认
时钟1时钟周期
=
100
判断结束
子程序
_时钟1_周期事件
标签1标题
=
“当前句柄:”
+
到文本
(取鼠标所在窗口句柄
())
实现原理是启动一个应用程序,通过ProcessID得到窗体句柄,然后对其设定父窗体句柄为本程序某控件句柄(本例是窗体内一个Panel的句柄),这样就达成了内嵌的效果。
新建窗体,上面放置一个Panel控件,名为pnlApp,然后按下面代码编写:
unit frmTestEmbedApp;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
pnlApp: TPanel;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
hWin: HWND = 0;
implementation
{$R dfm}
type
// 存储窗体信息
PProcessWindow = ^TProcessWindow;
TProcessWindow = record
ProcessID: Cardinal;
FoundWindow: hWnd;
end;
// 窗体枚举函数
function EnumWindowsProc(Wnd: HWND; ProcWndInfo: PProcessWindow): BOOL; stdcall;
var
WndProcessID: Cardinal;
begin
GetWindowThreadProcessId(Wnd, @WndProcessID);
if WndProcessID = ProcWndInfo^ProcessID then begin
ProcWndInfo^FoundWindow := Wnd;
Result := False; // 已找到,故停止 EnumWindows
end
else
Result := True; // 继续查找
end;
// 由 ProcessID 查找窗体 Handle
function GetProcessWindow(ProcessID: Cardinal): HWND;
var
ProcWndInfo: TProcessWindow;
begin
ProcWndInfoProcessID := ProcessID;
ProcWndInfoFoundWindow := 0;
EnumWindows(@EnumWindowsProc, Integer(@ProcWndInfo)); // 查找窗体
Result := ProcWndInfoFoundWindow;
end;
// 在 Panel 上内嵌运行程序
function RunAppInPanel(const AppFileName: string; ParentHandle: HWND; var WinHandle: HWND): Boolean;
var
si: STARTUPINFO;
pi: TProcessInformation;
begin
Result := False;
// 启动进程
FillChar(si, SizeOf(si), 0);
sicb := SizeOf(si);
siwShowWindow := SW_SHOW;
if not CreateProcess(nil, PChar(AppFileName), nil, nil, true,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, si, pi) then Exit;
// 等待进程启动
WaitForInputIdle(pihProcess, 10000);
// 取得进程的 Handle
WinHandle := GetProcessWindow(pidwProcessID);
if WinHandle > 0 then begin
// 设定父窗体
WindowsSetParent(WinHandle, ParentHandle);
// 设定窗体位置
SetWindowPos(WinHandle, 0, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOZORDER);
// 去掉标题栏
SetWindowLong(WinHandle, GWL_STYLE, GetWindowLong(WinHandle, GWL_STYLE)
and (not WS_CAPTION) and (not WS_BORDER) and (not WS_THICKFRAME));
Result := True;
end;
// 释放 Handle
CloseHandle(pihProcess);
CloseHandle(pihThread);
end;
procedure TForm1FormClose(Sender: TObject; var Action: TCloseAction);
begin
// 退出时向内嵌程序发关闭消息
if hWin > 0 then PostMessage(hWin, WM_CLOSE, 0, 0);
end;
procedure TForm1FormCreate(Sender: TObject);
const
App = 'C:\Windows\Notepadexe';
begin
pnlAppAlign := alClient;
// 启动内嵌程序
if not RunAppInPanel(App, pnlAppHandle, hWin) then ShowMessage('App not found');
end;
procedure TForm1FormResize(Sender: TObject);
begin
// 保持内嵌程序充满 pnlApp
if hWin <> 0 then MoveWindow(hWin, 0, 0, pnlAppClientWidth, pnlAppClientHeight, True);
end;
end
如果窗口是现有程序的,使用VS自带的spy++获取窗口的相关信息,然後使用WinAPI获取句柄,具体参考spy++的使用方法和winapi的使用FindWindow( lpClassName, {窗口的类名} lpWindowName: PChar {窗口的标题}): HWND; {返回窗口的句柄; 失败 详情>>
//获取QQ登陆窗口句柄
CWnd pWnd = FindWindow(_T("#32770"), _T("QQ用户登录"));
if(!pWnd)
{
MessageBox("未发现窗口");
}
else
{
//点击登陆按钮
CButton pbtnLogin = (CButton )pWnd->GetDlgItem(16032);
if (pbtnLogin)
{
pbtnLogin->PostMessage(WM_LBUTTONDOWN, 0, 0);
pbtnLogin->PostMessage(WM_LBUTTONUP, 0, 0);
}
}
或者:
//获取QQ登陆窗口句柄
HWND hWnd = ::FindWindow(_T("#32770"), _T("QQ用户登录"));
if(!hWnd)
{
MessageBox("未发现窗口");
}
else
{
//点击登陆按钮
HWND hbtnLogin = ::GetDlgItem(hWnd, 16032);
if (hbtnLogin)
{
::PostMessage(hbtnLogin, WM_LBUTTONDOWN, 0, 0);
::PostMessage(hbtnLogin, WM_LBUTTONUP, 0, 0);
}
}
句柄获取方法(获取该窗口的句柄后,即可向该窗口类类发送消息、处理程序):0。获取所在类窗口的句柄:this->m_hwnd1。主窗口的句柄:无论在主窗口类内,还是子窗口类内,获取主窗口句柄的方法:AfxGetMainWnd()->m_hWnd,如:::SendMessage(AfxGetMainWnd()->m_hWnd , WM_MY_DOSOME , 0 ,(LPARAM)i);在窗口类中this->m_hWnd或者this->GetSafeHwnd()2。子窗口句柄:用FindWindow,(只要知道子窗口的名字即可)如: ::FindWindow(NULL,WindowsName) 返回找到的窗口的句柄寻找当前窗口是否在运行windowname的程序,该名字为窗口名字,如:CWnd pWnd=FindWindow(NULL,_T("清芝--支票机"));//GetSafeHwnd函数功能:获取某个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数。通过下面的例子来看其理由
以上就是关于如何获取某个应用程序的窗体句柄全部的内容,包括:如何获取某个应用程序的窗体句柄、易语言动态取鼠标当前所在窗口句柄,我想在单击时取得窗口句柄。怎么弄、delphi 如何获取其它应用程序窗体中的所有控件句柄等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)