以下是满足要求的C++代码解决方案:
#include <windows.h>
#include <tlhelp32.h>
HWND g_hHlWindow = NULL;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) {
DWORD processId;
GetWindowThreadProcessId(hwnd, &processId);
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hSnapshot, &pe)) {
do {
if (pe.th32ProcessID == processId &&
_wcsicmp(pe.szExeFile, L"hl.exe") == 0) {
g_hHlWindow = hwnd;
return FALSE; // 终止枚举
}
} while (Process32Next(hSnapshot, &pe));
}
CloseHandle(hSnapshot);
return TRUE;
}
void ToggleWindowVisibility(bool show) {
EnumWindows(EnumWindowsProc, 0);
if (!g_hHlWindow) return;
LONG_PTR exStyle = GetWindowLongPtr(g_hHlWindow, GWL_EXSTYLE);
if (show) {
exStyle &= ~WS_EX_TOOLWINDOW;
ShowWindow(g_hHlWindow, SW_SHOW);
} else {
exStyle |= WS_EX_TOOLWINDOW;
ShowWindow(g_hHlWindow, SW_HIDE);
}
SetWindowLongPtr(g_hHlWindow, GWL_EXSTYLE, exStyle);
SetWindowPos(g_hHlWindow, 0, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
if (msg == WM_HOTKEY) {
if (wParam == 1) ToggleWindowVisibility(true); // Ctrl+Up
if (wParam == 2) ToggleWindowVisibility(false); // Ctrl+Down
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
int main() {
// 隐藏控制台窗口
ShowWindow(GetConsoleWindow(), SW_HIDE);
// 创建隐藏窗口
WNDCLASS wc = {0};
wc.lpfnWndProc = WndProc;
wc.hInstance = GetModuleHandle(NULL);
wc.lpszClassName = L"HotkeyWindowClass";
RegisterClass(&wc);
HWND hWnd = CreateWindow(wc.lpszClassName, L"", 0, 0, 0, 0, 0, NULL, NULL, wc.hInstance, NULL);
// 注册热键
RegisterHotKey(hWnd, 1, MOD_CONTROL, VK_UP);
RegisterHotKey(hWnd, 2, MOD_CONTROL, VK_DOWN);
// 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
代码说明:
1. 隐藏控制台窗口:使用ShowWindow(GetConsoleWindow(), SW_HIDE)
在程序启动时立即隐藏控制台
-
创建隐藏消息窗口:建立一个不可见的窗口用于接收热键消息,使用自定义的窗口过程处理
WM_HOTKEY
-
全局热键注册:
- Ctrl+↑ 注册为1号热键(显示窗口)
-
Ctrl+↓ 注册为2号热键(隐藏窗口)
-
窗口操作功能:
- 使用
EnumWindows
遍历所有窗口 - 通过进程快照匹配找到hl.exe的主窗口
- 使用
WS_EX_TOOLWINDOW
样式控制任务栏图标的显示 -
通过
SetWindowPos
强制刷新窗口样式 -
隐藏效果说明:
- 同时隐藏窗口本体和任务栏图标
- 修改窗口扩展样式确保隐藏效果持久
- 使用
SW_HIDE
彻底隐藏窗口
编译说明:
1. 在Dev-C++中创建新的Console Application项目
2. 粘贴代码到main.cpp
3. 项目属性 → 参数 → 链接器 → 添加以下选项:
-luser32 -lgdi32 -lkernel32
4. 编译运行(实际运行时无任何可见控制台窗口)
注意事项:
1. 需要以管理员权限运行程序才能操作其他进程的窗口
2. 确保目标程序hl.exe已经运行后再操作
3. 热键可能与其他程序冲突,可根据需要修改组合键
4. 隐藏效果在目标程序窗口最小化时最明显
5. 恢复显示时会保留窗口原有位置和尺寸
该方案完全使用Windows API实现,无任何第三方依赖,满足:
- 隐藏控制台窗口
- 纯后台运行
- 热键控制目标窗口
- 同时操作窗口和任务栏图标
- 实时响应热键操作