如何获取某个应用程序的窗体句柄

如何获取某个应用程序的窗体句柄,第1张

如果窗口是现有程序的,使用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 如何获取其它应用程序窗体中的所有控件句柄等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9800803.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存