有关控制自动关机的问题(200分)

  • 主题发起人 主题发起人 ydsoftyyd
  • 开始时间 开始时间
Y

ydsoftyyd

Unregistered / Unconfirmed
GUEST, unregistred user!
我在写一个监控软件,要求在系统关机前,可以自动保存其他应用程序,如WORD,EXECL等。关机功能已实现,自动保存不行,是否用截取消息的方法,如何实现。
 
可以向WORD发送CTRL+S,即可实现保存
 
关键是有可能有不同的应用程序。再说如果在WORD下同时编辑几个文档时,只能存第一个。
 
我想如果可以截取应用程序在系统要求关闭时,响应的是否存盘的消息时,可以用模拟按键来进行实现,我想这种思路是否可以实现,如果实现?是截取那一个消息?
 
Word不是有一个Save All命令吗,可以用Findwindow找到Word窗口
 
设钩子,findwindow<br>for all windows do<br>&nbsp; save<br>
 
在WORD2000中没有SAVE ALL,只能一个一个地去找,打开文件一多,就不行。<br>如果打开的是新创建的文件,它会提示保存的文件名是什么?<br>不行。
 
楼上说的有道理,新文件的时候成问题。
 
以前写过一个这样的程序,不过是一年多以前的事了<br>我记得当初好像是拦截WM_ENDMESSION消息,而且是在98下写的,<br>不知2000程XP行不。。。<br>查查WIN32 SDK
 
关键相应的应用程序得理你才行.<br>这样的话其实当你进行自动关机的时候,程序是可以得到系统要关机的消息的<br>完全可以处理自动保存等<br>至于特定的程序,比如WORD,找到所有运行的Application.遍历Documents,挨个Save
 
不同软件有不同的保存方法,很难笼统实现。
 
除非知道是哪些程序,否则没法实现
 
服务器方面可以使用它自带的功能,一般考虑的是OFFICE,图形处理软件,PCB处理软件等常用的软件。一般在安全关机时应用软件在关闭时会弹出一个提示窗口,问是否存的,我想如果能分别截取到这些窗口的消息,可以使用keybd_event来摸拟实现存盘的动作,请问各位高手,这种方法可行吗?如何实现最为简便?
 
大家说那么多,不如做一个<br>//ydsoftyyd,你的想法是对的,<br>//花了一下午才搞定,这个周末属于你的,咳,新来的,没开张呢,能来点分也好<br>//调试工具为Delphi的Winsignt,在win98,word97,D6下调试通过<br>implementation<br>{$R *.dfm}<br>const<br>&nbsp; sTitle1 = 'Microsoft Word';<br>&nbsp; sTitle2 = '另存为';<br><br>var<br>&nbsp; hDlg, hEdit, hBtn: THandle;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>&nbsp; FindSaveTipDlg;<br>&nbsp; Sleep(3000);//等会儿,后面"另存为"对话框还没出来呢<br>&nbsp; FindSaveFileAsDlg;<br>end;<br><br>procedure TForm1.FindSaveTipDlg;<br>begin<br>&nbsp; hDlg := FindWindow(PChar(WC_DIALOG), sTitle1);//找到'Microsoft Word'对话框的窗口,获得它的句柄<br>&nbsp; if hDlg = 0 then Exit;<br><br>&nbsp; hBtn := FindWindowEx(hDlg, 0, PChar('Button'), nil);//找到&lt;是&gt;按扭<br>&nbsp; SendNotifyMessage(hBtn, WM_LBUTTONDOWN, MK_LBUTTON, 0);//给&lt;是&gt;按扭发送一个按下鼠标左键的消息<br>&nbsp; SendNotifyMessage(hBtn, WM_LBUTTONDOWN, MK_LBUTTON, 0);//只发一次发现有时可以,有时不可以,再发一次,ok<br>&nbsp; SendNotifyMessage(hBtn, WM_LBUTTONUP, 0, 0);//再给&lt;是&gt;按扭发送一个弹起鼠标左键的消息<br>end;<br><br>procedure TForm1.FindSaveFileAsDlg;<br>var<br>&nbsp; sFileName: string;<br>&nbsp; i: Integer;<br>begin<br>&nbsp; hDlg := FindWindow(PChar('bosa_sdm_Microsoft Word 8.0'), sTitle2);//找到要"另存为"对话框的窗口,获得它的句柄<br>&nbsp; if hDlg = 0 then Exit;<br>&nbsp; hEdit := FindWindowEx(hDlg, 0, PChar('RichEdit20W'), nil);//先找到"保存位置"下拉框<br>&nbsp; if hEdit = 0 then Exit;<br>&nbsp; hEdit := FindWindowEx(hDlg, hEdit, PChar('RichEdit20W'), nil);//再找到"文件名"下拉框,<br>&nbsp; if hEdit = 0 then Exit;<br><br>// &nbsp;SendMessage(hEdit, WM_SETTEXT, 0, LPARAM(PChar(sFileName)));//模拟键盘输入文件名<br>&nbsp; //本来想用SendMessage(hEdit, WM_SETTEXT, 0, LPARAM(PChar(sFileName)));<br>&nbsp; //但输入的老是乱码,只好一个一个来,呵呵,将就用吧,大家也可讨论<br>&nbsp; sFileName := FormatDateTime('yyyymmddhhnnss', Now);//用时间做文件名<br>&nbsp; for i := 1 to Length(sFileName) do<br>&nbsp; begin<br>&nbsp; &nbsp; SendMessage(hEdit, WM_KeyDown, Ord(sFileName), MapVirtualKey(Ord(sFileName), 0));<br>&nbsp; &nbsp; SendMessage(hEdit, WM_Char, Ord(sFileName), MapVirtualKey(Ord(sFileName), 0));<br>&nbsp; &nbsp; SendMessage(hEdit, WM_KeyUp, Ord(sFileName), MapVirtualKey(Ord(sFileName), 0));<br>&nbsp; end;<br><br>&nbsp; SendMessage(hDlg, WM_KeyDown, $0D, 0);<br>&nbsp; SendMessage(hDlg, WM_KeyUp, $0D, 0);<br>end;<br><br>procedure TForm1.Timer1Timer(Sender: TObject);<br>begin<br>&nbsp; Timer1.Enabled := False;<br>&nbsp; try<br>&nbsp; &nbsp; FindSaveTipDlg;<br>&nbsp; &nbsp; FindSaveFileAsDlg;<br>&nbsp; finally<br>&nbsp; &nbsp; Timer1.Enabled := True;<br>&nbsp; end;<br>end;<br><br>end.
 
如果打开的是新创建的文件,它会提示保存的文件名是什么?<br>不行。 &nbsp;<br>=====================================================<br>新创建的文件难道不问问就保存吗?
 
试过上面的代码,发现不行的请告诉我
 
代码我试过了,可以用,但是只是限以使用在已经知道的应用软件上,不能解决一个较为通用的软件环境。如是使用OFFICE2000的话,要修改。还有一点小问题,就是使用TIME来控制,这个时间要设得较为合理才行
 
通用那就没办法啦,天知道一个软件在关闭之前要做什么。没错,OFFICE2000为'bosa_sdm_Microsoft Word 9.0'。Timer的时间设置并没有什么影响,几十ms到1s都可接受,对性能没什么大的妨碍,如果不想用,也可考虑在一线程里做
 
后退
顶部