我在编一个与UPS通讯的软件,目的是在UPS低电位时安全关机。
所谓安全关机即:对打开过文档文件的外部程序执行安全保存后关闭Windows,
现在我通过获取窗口句柄后再获取菜单File的子菜单Save 或Save As的句柄
已可以安全保存记事本、画图、写字板中的文档(SDI),但无法找到Word中的
子菜单句柄,不知何故?
请高手赐教,在下不尽感激!
有关源码如下:
procedure TDocSaveForm.SaveClose(nClassType:integer;sClassName,sNewFileTitle:string);
var
m:HMENU;
winName:Array[0..255] of Char;
begin
h:=FindWindow(pchar(sClassName),nil);
if h<>0 then
begin
GetWindowText(h,winName,SizeOf(winName));
SetForegroundWindow(h);
m:=GetMenu(h);//取主菜单句柄
m:=GetSubMenu(m,0);//取‘File’菜单句柄,通常为第一个
if Pos(uppercase(newFileTitle),uppercase(StrPas(@winName)))<=0 then //非新文件
if ClassType=11 then
//对于Word,运行File的第五个子菜单(即Save),测试无效
SendMessage(h,WM_COMMAND,MakeLong(GetMenuItemId(m,4),0),GetSubMenu(m,4))
else
//对于其他如WordPad,运行File的第三个子菜单(即Save),测试通过,可行
SendMessage(h,WM_COMMAND,MakeLong(GetMenuItemId(m,2),0),GetSubMenu(m,2))
else
if ClassType=11 then
//对于Word,运行File的第六个子菜单(即Save As),测试无效
SendMessage(h,WM_COMMAND,MakeLong(GetMenuItemId(m,5),0),GetSubMenu(m,5))
else
//对于其他如WordPad,运行File的第四个子菜单(即Save As) ,测试通过,可行
PostMessage(h,WM_COMMAND,MakeLong(GetMenuItemId(m,3),0),GetSubMenu(m,3));
//以下不必关注
h:=GetForegroundWindow;
if Pos(uppercase(newFileTitle),uppercase(StrPas(@winName)))<=0 then //非新文件
EnumChildWindows(h,@ClickYesInSaveDlg,0)
else
begin
SaveDocFlag:=0;
Timer1.enabled:=true;
end;
// CloseFlag:=0;
// TimerClose.enabled:=true;
end;
end;