Windows服务怎么获取窗口句柄

Windows服务怎么获取窗口句柄,第1张

使用EnumWindows和EnumChildWindows函数以及相对的回调函数EnumWindowsProc和EnumChildWindowsProc获取所有顶层窗口以及它们的子窗口(有些窗口做了特殊处理,比如QQ是不能通过这个方法获得的)!

通过类名或窗口标题查找,可使用 FindWindow 或 FindWindowEx 函数查找。知道父窗口句柄和控件 ID,可以用 GetDlgItem 来查找控件(子窗口)。也可使用 WndSpy、Microsoft Spy++ 等窗口探测软件直接查看窗口句柄、类名、样式等。

首先,你想要在某个窗口做一些事情,你就得让 *** 作系统知道你是在哪一个窗口做这些事情,而窗口的句柄就能起到识别哪一个窗口的作用;获取窗口句柄的方法(或者说是函数)有很多,有的函数是获得当前主窗口的句柄,有的函数获得子窗口的句柄,还有的函数可以获得你指定的那个窗口的句柄,你想获得哪个窗口的句柄就调用相应的函数就可以了;

然后,获得窗口句柄以后,你就可以利用这个窗口句柄做你那些想做的事情了。比如,设置窗口的风格,改变窗口的标题,隐藏这个窗口等等,如果你不知道能做什么,没事,等你实际用到的时候,需要你在某个窗口做事情的时候,你就知道了该做什么事情了。

希望对你有帮助。

在VC的窗口类中有一成员变量:m_hWnd

,它代表这个窗口的句柄

。因此在VC中通过一些得到窗口指针的函数,然后再访问它的成员变量,应该可以得到所要的句柄。

比如用这个函数得到窗口指针,然后访问它的m_hWnd

AfxGetMainWnd(

);

一般用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));

以上就是关于Windows服务怎么获取窗口句柄全部的内容,包括:Windows服务怎么获取窗口句柄、怎么得到窗口句柄、获取窗口句柄 能干什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存