Cygwin 下的mintty是否以任何方式支持失去和获得焦点的事件?
我正在寻找相当于 Windows 中的
WM_KILLFOCUS
或 autocmd FocusLost * call ...
中的 gvim
,但在 mintty 终端内的 Cygwin 下。
如果几天后没有实际答案,我将提供自己的答案,感谢@Philippe关于
GetForegroundWindow
的评论。
/* wait-focus-lost.cc */
#include <iostream>
#include <windows.h>
int main()
{
const HWND initial_window = GetForegroundWindow();
HWND current_window;
while ((current_window = GetForegroundWindow()) == initial_window)
Sleep(1);
const auto title = new wchar_t[MAX_PATH*2];
GetWindowTextW(current_window, title, MAX_PATH*2);
std::wcout << title << std::endl;
}
免责声明:上述代码中没有错误检查
这段代码等待前台窗口发生变化,并将新前台窗口的标题打印到
mintty
控制台。
我现在可以在
bash
脚本中使用此可执行文件,以便在执行另一个依赖于被窃取的焦点的操作之前等待。
由于我的环境是 Cygwin,我提供 Makefile,以防有人出现并尝试自己编译上述内容:
CXX = x86_64-w64-mingw32-g++
CC = x86_64-w64-mingw32-gcc
LDFLAGS = -static
CXXFLAGS = -O2 -Wall -Wextra
all: wait-focus-lost.exe
wait-focus-lost.exe: wait-focus-lost
注意:由于
.exe
扩展,Cygwin 下需要额外的规则来利用 both make
隐式规则 and 依赖项检查。仅使用 all: wait-focus-lost
可以进行编译,但会破坏依赖项检查。