使用findwindow找到隐藏窗口使用sendmessage发送wm_close消息,无法关闭。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用findwindow找到隐藏窗口使用sendmessage发送wm_close消息,无法关闭。相关的知识,希望对你有一定的参考价值。

使用findwindow找到隐藏窗口使用sendmessage发送wm_close消息,无法关闭。为什么?怎么关?

参考技术A 要关的窗口估计不是你建的,不考虑Win7权限的情况下,在收到WM_CLOSE后,目标窗口的进程不一定会调用DestroyWindow来销毁这个窗口句柄,就算会关闭,也不一定会结束进程,毕竟窗口不代表程序的全部过程.
如果想结束对方的进程,Post一个QuitMessage,但是这个消息多数往往是在窗口已经销毁的情况才会发送,现在你发送了,对方恰恰会认为窗口已经销毁了,会结束进程,那么这个窗口会消失,但是内存不一定会释放.

无聊刚做了个测试,希望能帮到你...

// test1.cpp : 定义控制台应用程序的入口点。
//
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <iostream>
int wmain(int argc, wchar_t* argv[])

HWND hWnd = FindWindow(0, L"完美助手"); //测试窗口
ShowWindow(hWnd, SW_HIDE); //使隐藏,显示,测试都没问题
system("pause");
ShowWindow(hWnd, SW_SHOW);
system("pause");
ShowWindow(hWnd, SW_HIDE);
system("pause");

// 关闭
SendMessage(hWnd, WM_CLOSE, 0, 0);
// PostMessage(hWnd, WM_QUIT, 0, 0); //这句一直是禁用的,启用后,下面的奇怪问题都没了.
system("pause");
char txt[128];
ZeroMemory(txt, 128);
GetWindowTextA(hWnd, txt, 128); // 读窗口有内容,说明没关住
printf("窗口标题:%s\n", txt);

if (FindWindow(0, L"完美助手")) // 还能找到
std::cout << "窗口似乎没有关闭" << std::endl;


if (!ShowWindow(hWnd, SW_SHOW)) // 但是显示不出来了
std::cout << "窗口不存在" << std::endl;


ZeroMemory(txt, 128);
GetWindowTextA(hWnd, txt, 128); // 再读窗口内容,没了
printf("窗口标题:%s\n", txt);
return 0;

C#中,findWindow函数怎么不能找到??

在 C# 中使用 FindWindow() 函数时,有可能会找不到窗口。这可能是由于以下几个原因导致的:

    窗口句柄不存在: FindWindow() 函数只能查找已经存在的窗口,如果窗口不存在或已经关闭,则无法找到窗口句柄。

    窗口标题不匹配: FindWindow() 函数只能查找具有特定标题的窗口,如果标题不匹配或者拼写错误,则无法找到窗口句柄。

    窗口类名不匹配: FindWindow() 函数只能查找具有特定类名的窗口,如果类名不匹配或者拼写错误,则无法找到窗口句柄。

    窗口不在当前桌面: FindWindow() 函数只能查找在当前桌面的窗口,如果窗口在其他桌面或者运行在其他用户账户中,则无法找到窗口句柄。

    如果你确定窗口已经存在,可以尝试使用其他方法,比如 EnumWindows 函数来枚举所有窗口,再找到你需要的窗口。

参考技术A 1.缺少declare,正确的描述如下
private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

2 declare的说明
Declare 语句

用于在模块级别中声明对动态链接库 (DLL) 中外部过程的引用。
语法 1
[Public | Private] DeclareSubnameLib"libname" [Alias"aliasname"] [([arglist])]
语法 2
[Public | Private] DeclareFunctionnameLib"libname" [Alias"aliasname"] [([arglist])] [Astype]
Declare 语句的语法包含下面部分:
部分 描述
Public 可选的。用于声明对所有模块中的所有其它过程都可以使用的过程。
Private 可选的。用于声明只能在包含该声明的模块中使用的过程。
Sub 可选的(但Sub 或 Function 二者需选其一)。表示该过程没有返回值。
Function 可选的(但Sub 或 Function 二者需选其一)。表示该过程会返回一个可用于表达式的值。
name 必需的。任何合法的过程名。注意动态链接库的入口处(entry points)区分大小写。
Lib 必需的。指明包含所声明过程的动态链接库或代码资源。所有声明都需要Lib 子句。
libname 必需的。包含所声明的过程动态链接库名或代码资源名。
Alias 可选的。表示将被调用的过程在动态链接库 (DLL)
中还有另外的名称。当外部过程名与某个关键字重名时,就可以使用这个参数。当动态链接库的过程与同一范围内的公用变量、常数或任何其它过程的名称相同时,也可以使用
Alias。如果该动态链接库过程中的某个字符不符合动态链接库的命名约定时,也可以使用 Alias。
aliasname 可选的。动态链接库或代码资源中的过程名。如果首字符不是数字符号 (#),则
aliasname 是动态链接库中该过程的入口处的名称。如果首字符是
(#),则随后的字符必须指定该过程的入口处的顺序号。
arglist 可选的。代表调用该过程时需要传递的参数的变量表。
type 可选的。Function 过程返回值的数据类型;可以是 Byte、布尔、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(只支持变长)或 Variant,用户定义类型,或对象类型。
arglist 参数的语法以及语法各个部分如下:
[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [Astype]

以上是关于使用findwindow找到隐藏窗口使用sendmessage发送wm_close消息,无法关闭。的主要内容,如果未能解决你的问题,请参考以下文章

如何使用vba在windowapi中使用findwindow函数定位窗口?

窗口信息轰炸

FindWindow函数执行失败,无法找到窗口句柄

急!如何用findwindow函数找到所有打开的窗口,然后用sendmessag

是否有一个模块可以在 python 中用作 FindWindow API

FindWindow FindWindowEx