用VB或VB.NET用API函数FindWindow获取一个当前XX窗口句柄

用VB或VB.NET用API函数FindWindow获取一个当前XX窗口句柄,第1张

这是一个vb用findwindow等api找到其它窗口,并且更改其它窗口的文本的源码:

>

因为是子窗口,所以找不到。可以用EnumChildWindows来寻找。

BOOL EnumChildWindows( HWND hWndParent,

WNDENUMPROC lpEnumFunc,

LPARAM lParam

);

Find Window的函数原型:

FindWindow(

lpClassName, {窗口的类名}

lpWindowName: PChar {窗口的标题}

): HWND; {返回窗口的句柄; 失败返回 0}

C语言测试代码(假如要查系统自带的 放大镜 窗口,前提是已经打开放大镜窗口):

HWND h = FindWindow(NULL, "放大镜");

if(0 == h)

{

ShowMessage("can't find 放大镜");

}

else

{

ShowMessage(IntToStr(h)); //查找到窗口,并且打印出该窗口的句柄

}

一般用FindWindow。。。

Delphi中获取其它进程的窗口句柄,在Delphi中获取其它进程的窗口句柄,绝大部分人首先想到的会使用:FindWindow或者用GetWindow来遍历查找,如:

Delphi/Pascal code

handle := FindWindow(nil,PChar('窗口的标题'));

或者:

Delphi/Pascal code

procedure TForm1Button1Click(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 TForm1Button1Click(Sender: TObject);

var

ProcessName : string; //进程名

FSnapshotHandle:THandle; //进程快照句柄

FProcessEntry32:TProcessEntry32; //进程入口的结构体信息

ContinueLoop:BOOL;

MyHwnd:THandle;

begin

FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //创建一个进程快照

FProcessEntry32dwSize:=Sizeof(FProcessEntry32);

ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32); //得到系统中第一个进程

//循环例举

while ContinueLoop do

begin

ProcessName := FProcessEntry32szExeFile;

if(ProcessName = '要找的应用程序名exe') then begin

MyHwnd := GetHWndByPID(FProcessEntry32th32ProcessID);

end;

ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);

end;

CloseHandle(FSnapshotHandle); // 释放快照句柄

end;

//跟据ProcessId获取进程的窗口句柄

function TForm1GetHWndByPID(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 <> EIProcessID) or

(not IsWindowVisible(WND)) or

(not IsWindowEnabled(WND));

if not Result then EIHWND := WND;

end;

function FindMainWindow(PID: DWORD): DWORD;

var

EI: TEnumInfo;

begin

EIProcessID := PID;

EIHWND := 0;

EnumWindows(@EnumWindowsProc, Integer(@EI));

Result := EIHWND;

end;

begin

if hPID<>0 then

Result:=FindMainWindow(hPID)

else

Result:=0;

end;

我说的是组件的句柄,不是窗体的句柄

findwindowex();获取指定句柄窗口下的子控件,当然是有句柄的控件

窗体的句柄都知道,还能不知道里面组件的句柄?——windows标准组件

procedure TForm1Button2Click(Sender: TObject);

var

canvas1: TCanvas;

begin

Canvas1 := TCanvasCreate;

//这是OK。这真要感谢baidu,google

canvas1Handle := GetDc(panel1Handle);

canvas1TextOut(1,1,'hello');

canvas1Free ;

Form1CanvasTextOut(10, 10, 'fff');

end;

有的组件是没有句柄的

ShowMessage(IntToStr(TWinControl(Form1FindChildControl('Panel1'))Handle));

void CfindDlg::OnBnClickedButton1()

{

if(FindWindow(NULL,L"我的电脑")!=NULL)

MessageBox(L"我的电脑运行中",L"提示1");

else

MessageBox(L"我的电脑没有运行",L"提示2");

}

说明:这个程序在vs2010中编译成功,使用的是MFC环境

其中OnBnClickedButton1() 就是那个按钮的 点击事件

字符串前面的L 是因为vs2010默认Unicode 字符集,加上L 就是宽字符的意思,如果使用多字节字符集 就把L去掉。

还是那句话 FindWindow 只能发现 有窗口的程序,如果一个程序没有窗口,什么也发现不了 ,你要明白,进程与窗口是完全两个不同的概念,不要指望FindWindow 来发现 所有的进程。

其中“我的电脑” 可以使用其他的代替如“保皇-大厅1”

如果是多个窗口,那应该每个窗口是一个进程,你通过FINDWINDOW可以找到对应的进程, *** 作就可以了。如果是浏览器,每个tab应该是子窗体,用FINDWINDOWEX函数来找就行了。

以上就是关于用VB或VB.NET用API函数FindWindow获取一个当前XX窗口句柄全部的内容,包括:用VB或VB.NET用API函数FindWindow获取一个当前XX窗口句柄、易语言怎么用FindWindow 取得句柄啊、VC++ 高手进 :findwindow函数怎么获取不到这个窗口等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/web/9292338.html

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

发表评论

登录后才能评论

评论列表(0条)

保存