取消红蜘蛛窗口置顶

红蜘蛛是我们上课时使用的屏幕广播软件,它的窗口会遮挡住所有的其他窗口,在听课的时候我们无法在一个屏幕内很方便的跟着老师一起写代码或者看文档。除非你拖动一下窗口的位置,但这样我们又无法查看整个广播的屏幕了。

解决这个问题有两个办法,一个是在窗口中间点击右键,会弹出一个菜单,点击第一个“显示工具栏”,随后再右键点击一次显示工具栏。这样窗口就可以让其他窗口覆盖了。我们可以一边听课一边跟着老师写代码。如下图:

2015-05-21_102818

当然我们本文主要给大家表达的并非是这种绕过问题的方式,而是我们如何通过代码实现,让这个窗口不在我们所有的窗口前面。在讨论这个问题之前,在讨论这个问题之前,我们要先知道,该如何操作这些窗口的属性。具体的步骤如下:

1、遍历所有 Windows 可见的窗口。(API EnumWindows)

2、获取每一个窗口的文本。(API GetWindowText)

3、判断窗口的文本是否包含红蜘蛛窗口文本的关键字“接收演示或示范中”。(字符串处理函数strstr)

2015-05-21_191136

4、如果包含关键字则取消窗口置顶属性。(SetWindowPos)

具体代码如下:

#include <iostream>
#include <Windows.h>
#include <Shlwapi.h>

#pragma comment(lib, "Shlwapi.lib")

BOOL CALLBACK EnumWindowsProc(
	_In_  HWND hwnd,
	_In_  LPARAM lParam
	)
{
	TCHAR szTitle[BUFSIZ];
	GetWindowText(hwnd, szTitle, BUFSIZ);
	// 不区分大小写判断窗口是否包含某些关键字
	if (StrStrI(szTitle, TEXT("接收演示或示范中")) != NULL)
	{
		// 输出窗口标题
		std::wcout.imbue(std::locale("chs"));
		std::wcout << szTitle << std::endl;
		// 设置窗口属性,HWND_NOTOPMOST 属性是取消窗口置顶
		// SWP_NOMOVE 为忽略第三个和第四个参数
		// SWP_NOSIZE 为忽略第五个和第六个参数
		SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
		return FALSE;
	}
	return TRUE;
}

int main(int argc, char* argv[])
{
	// 遍历所有窗口,第一个参数是一个回调函数
	EnumWindows(EnumWindowsProc, 0);
	getchar();
	return 0;
}

以上代码在VS中新建一个Win32控制台空项目,然后新建一个cpp文件粘贴进去编译即可。得出的exe会自动搜索红蜘蛛窗口并将其取消置顶属性,这样我们就可以一边看广播,一边跟着操作了。

说说你的想法