当前位置:首页 > 综合 > 易语言检测窗口是否存在 正文

易语言检测窗口是否存在

来源:烟消火灭网   作者:热点   时间:2026-10-17 05:52:00

易语言里检测窗口是易语言检否存在,最直接的测窗存办法就是调用API函数FindWindow。这个函数藏在user32.dll里面,口否声明一下就能用。易语言检很多人第一次写的测窗存时候会懵,因为易语言的口否API声明格式和C语言不太一样,参数类型得对应好。易语言检

我先给个能跑的测窗存代码。新建一个易语言程序,口否在启动窗口上放个按钮,易语言检双击进入代码编辑区。测窗存先写DLL命令声明:

.版本 2 .DLL命令 FindWindow,口否 整数型, "user32.dll", "FindWindowA" .参数 类名, 文本型, , 窗口类名 .参数 窗口标题, 文本型, , 窗口标题 

注意这里用的是FindWindowA,不是易语言检FindWindow。Windows API有两套版本,测窗存A结尾的口否是ANSI版本,W结尾的是Unicode版本。易语言默认处理ANSI字符串,所以用A版本省事。你要是用了FindWindowW,传进去的文本编码不对,返回值永远是0,查半天查不出问题。

然后按钮的点击事件里这么写:

.子程序 _按钮1_被单击 .局部变量 窗口句柄, 整数型 窗口句柄 = FindWindow (“Notepad”, 字符 (0)) .如果真 (窗口句柄 ≠ 0) 信息框 (“记事本开着呢”, 0, ) .如果真结束 .如果真 (窗口句柄 = 0) 信息框 (“没找到记事本”, 0, ) .如果真结束 

这里有个细节:第二个参数我传了字符(0)。FindWindow的第二个参数是窗口标题,如果你只想按类名查找,标题就传空。但易语言里直接传空文本""有时候会出问题,传字符(0)相当于C语言里的NULL指针,更稳妥。类名"Notepad"是记事本窗口的类名,这个用Spy++或者窗口探测工具能查到。

实际用的时候,很多人会遇到一个坑:窗口标题带空格或者特殊字符。比如你想找标题为"新建文本文档.txt - 记事本"的窗口,直接写全标题经常匹配不到。因为记事本标题会随文件路径变化,你写死了就失效。这时候要么用FindWindowEx遍历子窗口,要么改用EnumWindows枚举所有顶层窗口,再逐个比较标题。

EnumWindows稍微麻烦点,但更灵活。需要声明回调函数,易语言里用子程序指针传进去。我试过一次,枚举了三百多个窗口,速度完全没问题。关键是在回调里用GetWindowText取标题,用GetClassName取类名,然后自己写匹配逻辑。想模糊匹配就找子串,想精确匹配就全等比较。

还有个情况:窗口最小化了,FindWindow照样能找到。窗口被其他窗口挡住,也能找到。FindWindow找的是窗口句柄,跟窗口可见不可见没关系。但窗口如果被销毁了,句柄就失效了,返回值变成0。所以检测之前最好确认一下目标程序有没有退出。

我平时写辅助工具的时候,习惯把检测封装成一个子程序,返回逻辑型。调用方只管传类名和标题,内部处理空值和异常。这样主流程干净,改起来也方便。比如:

.子程序 窗口是否存在, 逻辑型, 公开 .参数 类名, 文本型, , .参数 标题, 文本型, , .局部变量 句柄, 整数型 .如果真 (类名 = “” 且 标题 = “”) 返回 (假) .如果真结束 句柄 = FindWindow (类名, 标题) 返回 (句柄 ≠ 0) 

这样调用的时候就一行:.如果真 (窗口是否存在 (“Notepad”, “”)),看着舒服多了。

最后提一句,FindWindow虽然简单,但有个限制:它只能找顶层窗口。像记事本里面的编辑框、按钮这些子窗口,得用FindWindowEx,指定父窗口句柄才能找到。不过大多数场景下,判断一个程序有没有运行,找主窗口就够了。

标签:

责任编辑:百科