如何点击外部应用程序的弹出对话框按钮?

鐵蛋 2009-07-04 10:13:24
我在自己的程序里面用CreateProcess打开了windows的一个TIF看图工具,而且是直接打开一张网络硬盘上的图片(传入命名行参数),这个时候系统会提示该图片是只读,是否需要打开本地副本的对话框,我想做的是模拟一个keydown事件直接点enter(或是发消息给提示对话框,要不然每次打开图片都会提示那个很烦人的对话框),而这个时候实际上外部程序已经中断在那儿,程序似乎没法继续执行下去,哪位大人晓得这个问题该如何解决?
...全文
90 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
鐵蛋 2009-07-06
  • 打赏
  • 举报
回复
今天上午搞了一上午终于搞定,过程是这样的:CreateProcess的时候让主线程挂起,然后HOOK(这里要用到系统钩子),接着唤醒主线程,唤醒之后他就会执行hook里面的回调函数关闭对话框。

总结:
我觉得我遇到的这个问题的难点在于,创建进程(命名行参数,CreateProcess的第二个参数,“路径名 图片名”)时弹出提示几乎是同时发生,按正常做法几乎没有插入点让我来执行关闭对话框的代码,因为弹出对话框后程序已经中断了,于是我看CreateProcess的帮助,碰运气希望找到一点蛛丝马迹,后来我看到dwCreationFlags参数里面的CREATE_SUSPENDED,之前是默认的参数,发现主线程真的挂起,而后面的代码又能执行,于是我就想到了hook,在SetWindowsHookEx函数里面,开始我试了WH_MSGFILTER钩子,发现不行,最后我换WH_SYSMSGFILTER钩子,回调函数SysMsgProc里面选参数MSGF_DIALOGBOX,就这样一步一步找下来,居然搞定了!哈哈
鐵蛋 2009-07-05
  • 打赏
  • 举报
回复
up一下,没人遇到过类似情况吗
鐵蛋 2009-07-04
  • 打赏
  • 举报
回复
这段代码我是这样写的,问题是在创建外部程序打开图片后,弹后提示,系统中断,后面的程序不执行了(后面就有我写的发消息关闭对话框的代码,以及还有一个创建一窗体以及一些计算之类的代码),要等手动关闭对话框之后,程序才能执行下去,才能创建后面的窗体以及一些计算
gyk120 2009-07-04
  • 打赏
  • 举报
回复
用spy++查看窗口句柄,然后根据句柄向窗口发消息
wintergoes 2009-07-04
  • 打赏
  • 举报
回复

// 以一个删除文件时的提示框为例
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;

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧