有时候一次性修改了10几个Word文档没保存,手动关闭很麻烦,写了这个小程序。
通过spy++获取Word句柄,发现Word的保存并不能触发 WM_COMMAND,所以只能在关闭时弹窗的时候来模拟用户按下Enter来保存文档。但因为是模拟用户操作,所以效率并不算高。
c
#include <windows.h>
#include <stdio.h>
#include <string.h>
void SendEnterKey(HWND hWnd)
{
INPUT input[2] = {0};
// 按下 Enter 键
input[0].type = INPUT_KEYBOARD;
input[0].ki.wVk = VK_RETURN;
// 释放 Enter 键
input[1].type = INPUT_KEYBOARD;
input[1].ki.wVk = VK_RETURN;
input[1].ki.dwFlags = KEYEVENTF_KEYUP;
// 发送输入事件
SendInput(2, input, sizeof(INPUT));
}
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
TCHAR className[256];
GetClassName(hwnd, className, sizeof(className) / sizeof(TCHAR));
if (strcmp(className,"OpusApp") == 0)// 找到了 Word 窗口
{
// SendMessage(hwnd, WM_CLOSE, 0, 0); //如果关闭时弹出保存,程序就会进入了消息循环中,等待手动确认,否则不会继续往下执行
PostMessage(hwnd, WM_CLOSE, 0, 0); // 异步发送
SetForegroundWindow(hwnd); // 设置为前台窗口 获得焦点
SendEnterKey(hwnd); // 模拟Enter键 确认保存
Sleep(500);// 等一会 下个窗口弹出需要时间
}
return TRUE; // 继续枚举下一个窗口
}
int main()
{
// 枚举系统中所有的顶级窗口,并对每个窗口调用 EnumWindowsProc 回调函数
EnumWindows(EnumWindowsProc, 0);
puts("The End!");
return 0;
}
要想高效率操作Word,需要用到Office的COM库,但是C语言实现起来非常复杂,C++配置起来也很麻烦,Python导入win32com.client库就可以轻松实现,所以要想高效率的操作Word,就用Python来写。