ShellExecute调用的外部程序如何控制?

water2 2007-05-03 12:02:59
我用ShellExecute调用了一个外部程序,该程序启动时会弹出窗口,要确定或取消,我该如何控制这个外部程序以“确定”或“取消”?谢谢。
...全文
509 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
hugsnow 2008-07-22
  • 打赏
  • 举报
回复
建议不用ShellExecute,用createprocess结合WaitForSingleObject更好
下面是Delphi代码,很容易就翻译成BCB的

procedure TForm1.Button1Click(Sender: TObject);
var
s:STARTUPINFO;
p:PROCESS_INFORMATION;
begin
ZeroMemory(@s,Sizeof(STARTUPINFO));
s.cb:=Sizeof(STARTUPINFO);
ZeroMemory(@p,Sizeof(PROCESS_INFORMATION));
if createprocess(nil,'notepad.exe',nil,nil,false, 0,nil,nil,s,p) then
begin
WaitForSingleObject(p.hProcess,INFINITE);
Showmessage('Application is done!');
end
else
Showmessage('Unable run application!');
end;
hansyswin 2008-07-22
  • 打赏
  • 举报
回复
mark
jacknes009 2008-07-11
  • 打赏
  • 举报
回复
写INI的方式。。
jone7319 2008-07-09
  • 打赏
  • 举报
回复
给个例子给你
Form1->Hide() ;
TStringList *add=new TStringList();
add=Form3->StrToStrList(ADOQuery1->FieldByName("Notes地址")->AsString); //Notes邮件地址

String notespath=ADOQuery1->FieldByName("Notes安装地址")->AsString;
String notespass=ADOQuery1->FieldByName("Notes用户密码")->AsString;

HWND f,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,ff;
f=FindWindow("NOTES",NULL);
if(f)
{
HMENU hm=GetMenu(f);
HMENU sm= GetSubMenu(hm,0);
UINT mm=GetMenuItemID(sm, 17); //关闭NOTES
PostMessage(f,WM_COMMAND,mm,NULL);
Sleep(500);
}

f=FindWindow("#32770","输入口令");

if(!f)
{
ShellExecute(Application->Handle,"open",(notespath+"\\notes.exe").c_str() ,"","",SW_SHOWNORMAL );
while(!f)
f=FindWindow("#32770","输入口令");
}


f=FindWindow("#32770","输入口令");
Sleep(500);
char password[20];
strcpy(password,notespass.c_str() );
if(f)
{
for(int i=0;i<11;i++) //输入密码
SendDlgItemMessage(f, 0x12D, WM_CHAR,password[i],0);
SendDlgItemMessage( f,0x1, BM_CLICK, 0, 0);//点击确认

}
jone7319 2008-07-09
  • 打赏
  • 举报
回复
这个用消息很好处理
wwp3321 2008-07-09
  • 打赏
  • 举报
回复
找到ShellExecute调用执行的窗口a-->>找到窗口a上的控件b--->模拟点击( b->click() ).
laowang2 2008-07-09
  • 打赏
  • 举报
回复
老妖的可行,另外你用sendmessage也可以。
leegun 2008-07-07
  • 打赏
  • 举报
回复
学习了,谢谢妖哥
ly_liuyang 2007-10-31
  • 打赏
  • 举报
回复
CC就是强~就那样就Ok了
flyingpig4945 2007-08-23
  • 打赏
  • 举报
回复
妖哥真是偶像啊:-)
学习中……
ccrun.com 2007-07-07
  • 打赏
  • 举报
回复
用ShellExecute启动进程以后,稍作延时(因为程序启动需要一点时间),用FindWindow查找主窗口,然后用FindWindowEx/GetWindow查找子窗口(指窗体上的按钮等),通过BN_CLICK消息模拟点击按钮。
xiaoyuezhong 2007-07-07
  • 打赏
  • 举报
回复
我也想听听达人的高见~~
ReverseEngineering 2007-07-03
  • 打赏
  • 举报
回复
可以跨进程SendMessage?真的吗?
ReverseEngineering 2007-07-03
  • 打赏
  • 举报
回复
控制不了!SendMessage也不行!
cczlp 2007-05-17
  • 打赏
  • 举报
回复
FindWindow SendMessage就可以完成
MPTD_Fire 2007-05-17
  • 打赏
  • 举报
回复
lz
自己写个批处理文件,就可以让程序一直执行下去了
你在BAT文件里可以下命令
CsharpGame 2007-05-03
  • 打赏
  • 举报
回复
根据窗体标题查找窗口句柄,向该窗口发送消息!
water2 2007-05-03
  • 打赏
  • 举报
回复
大致方法好像是应当找到该窗口的句柄,然后对该窗口发送消息,也不知对不对,我也比较菜,不会写这样的代码。
Y___Y 2007-05-03
  • 打赏
  • 举报
回复
ShellExecute后的程序基本不受你控制了,除了你是它的父进程外,和你的程序没关系
记得好像《windows核心编程》里面介绍了 作业 的方法来限制程序,可以参考一下
pig4210 2007-05-03
  • 打赏
  • 举报
回复
在ShellExecute前就在程序中提示用户是否运行喽。
如果调用了外部程序以后,就需要发送消息来控制外部程序了。

1,222

社区成员

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

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