我在自己的程序里面用CreateProcess打开了windows的一个TIF看图工具,而且是直接打开一张网络硬盘上的图片(传入命名行参数),这个时候系统会提示该图片是只读,是否需要打开本地副本的对话框,我想做的是模拟一个keydown事件直接点enter(或是发消息给提示对话框,要不然每次打开图片都会提示那个很烦人的对话框),而这个时候实际上外部程序已经中断在那儿,程序似乎没法继续执行下去,哪位大人晓得这个问题该如何解决?
解决方案 »
- 关于TMemoryStream的问题,还有调试时如何监视
- 熟悉VC和delphi的朋友,请帮忙把C的代码翻译成Delphi的
- delphi7编译时,凡是遇到使用pointer的地方 就会 报unsafe type 提示,怎么去掉??
- 新新手的困惑
- 关于多TTimer的问题?
- String的Memory Copy,急,急!!!!!!!
- 资源编辑
- DELPHI5开发人员指南的13.2防止出现多实例章节中的程序例子看不懂,请高手指点...
- Access数据库加密问题
- 《Delphi2程序设计大全》那里可以买到?杭州已经绝版了。我找不到!那位同志可以告诉我?
- DBGridEh如何读取当前表里的记录数
- delphi 2007 中三层开发都用些什么控件啊?
// 以一个删除文件时的提示框为例
procedure TForm1.Button1Click(Sender: TObject);
var
FormHandle: THandle;
ButtonHandle: THandle;
begin
// 第一个参数是对话框窗口的类名,不知道可以用spy++查看,后一个参数是对话窗口的标题
FormHandle := FindWindow('#32770', '确认文件删除');
// 父窗口句柄,起始子窗口句柄,查找控件类名,此处为Button,后面是按钮显示的内容
ButtonHandle := FindWindowEx(FormHandle, 0, 'Button', '否(&N)',);
// 发送单击按钮
SendMessage(ButtonHandle, WM_LBUTTONDOWN, 0, 0);
SendMessage(ButtonHandle, WM_LBUTTONUP, 0, 0);
end;
我觉得我遇到的这个问题的难点在于,创建进程(命名行参数,CreateProcess的第二个参数,“路径名 图片名”)时弹出提示几乎是同时发生,按正常做法几乎没有插入点让我来执行关闭对话框的代码,因为弹出对话框后程序已经中断了,于是我看CreateProcess的帮助,碰运气希望找到一点蛛丝马迹,后来我看到dwCreationFlags参数里面的CREATE_SUSPENDED,之前是默认的参数,发现主线程真的挂起,而后面的代码又能执行,于是我就想到了hook,在SetWindowsHookEx函数里面,开始我试了WH_MSGFILTER钩子,发现不行,最后我换WH_SYSMSGFILTER钩子,回调函数SysMsgProc里面选参数MSGF_DIALOGBOX,就这样一步一步找下来,居然搞定了!哈哈