这是关于netmeeting的第四问贴了。问题是这样的,我用一按钮执行打开netmeeting操作,代码见下:
ShellExecute(0,'open','conf.EXE',nil,nil,SW_HIDE);
sleep(6000);
h:=FindWindow(nil,'NetMeeting - 通話なし');
hnext1:=FindWindow(nil,'NetMeeting');
if (h=0) then
begin
if (hnext1<>0) then
SetWindowPos(hnext1,0,0,0,0,0, SWP_NOSIZE +SWP_NOMOVE+ SWP_HIDEWINDOW);
.......
........
else
SetWindowPos(h,hwnd_topmost,0,0,0,0, SW_SHOWNORMAL+SWP_NOSIZE +SWP_NOMOVE+SWP_SHOWWINDOW);
//已经注册过netmeeting,即直接启动netmeeting1、shellexecute打开操作需要一段时间,除了设置sleep以外,还有什么方法?(我想不同的计算机或者同一计算机打开程序的多少,决定了程序能获得CPU的占用率,所以考虑复杂一些)
2、因为有可能是第一次运行netmeeting,需要注册、填写用户名等信息,我想隐藏该注册界面,上述方法虽能隐藏,但是总会先显示,一闪即过,再隐藏。有什么办法能解决?
3、再有我要是用Terminateprocess结束进程,例如在没有输入用户信息,我就退出netmeeting,是必须一开始得用cressprocess打开netmeeting吗?期待大家能帮忙!
ShellExecute(0,'open','conf.EXE',nil,nil,SW_HIDE);
sleep(6000);
h:=FindWindow(nil,'NetMeeting - 通話なし');
hnext1:=FindWindow(nil,'NetMeeting');
if (h=0) then
begin
if (hnext1<>0) then
SetWindowPos(hnext1,0,0,0,0,0, SWP_NOSIZE +SWP_NOMOVE+ SWP_HIDEWINDOW);
.......
........
else
SetWindowPos(h,hwnd_topmost,0,0,0,0, SW_SHOWNORMAL+SWP_NOSIZE +SWP_NOMOVE+SWP_SHOWWINDOW);
//已经注册过netmeeting,即直接启动netmeeting1、shellexecute打开操作需要一段时间,除了设置sleep以外,还有什么方法?(我想不同的计算机或者同一计算机打开程序的多少,决定了程序能获得CPU的占用率,所以考虑复杂一些)
2、因为有可能是第一次运行netmeeting,需要注册、填写用户名等信息,我想隐藏该注册界面,上述方法虽能隐藏,但是总会先显示,一闪即过,再隐藏。有什么办法能解决?
3、再有我要是用Terminateprocess结束进程,例如在没有输入用户信息,我就退出netmeeting,是必须一开始得用cressprocess打开netmeeting吗?期待大家能帮忙!
解决方案 »
- TDBRadioGroup 无法被选中
- 如何做到让两个EDIT控件内容相乘得出结果后显示在第3个edit控件里?
- RyanGT(笑书神侠) 请进来,给你100分.
- 托盘程序退出后,为什么图标不消失呢?
- 一个关于窗体大小控制问题?
- 在FastReport报表中如何设置Picture中的图片旋转角度?
- 关于获取数据库时间的问题!
- 介绍一下关于Windows编程的书籍?最好是消息处理的书,感觉自己水平继续提高啊。UP有分
- 问两个关于报表的问题。同志们我可是出血了,100大分啊。请你们尽力帮帮我(内详)。
- 怎样将几个不同库的查询结果用一个DBGrid显示出来了。。。
- 读取一款软件在硬盘上生成的的xml,不成功,原因是标识名称以数字打头,如何解决?
- 红旗下面用delphi7编程(不是kylix哟)
begin
h:=FindWindow(nil,'NetMeeting - 通話なし');
end;这样就可以了
谢谢HeroicDragon,因为它涉及到有些人是第一次使用netmeeting,所以弹出的是注册向导,hnext1:=FindWindow(nil,'NetMeeting');
不能单纯的用h:=FindWindow(nil,'NetMeeting - 通話なし'),将陷入死循环
function WinExecAndWait(APath: PChar; ACmdShow: Integer;
ATimeout: Longword): Integer;
var
vStartupInfo: TStartupInfo;
vProcessInfo: TProcessInformation;
begin
FillChar(vStartupInfo, SizeOf(TStartupInfo), 0);
with vStartupInfo do
begin
cb := SizeOf(TStartupInfo);
dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
wShowWindow := ACmdShow;
end;
if CreateProcess(nil, APath, nil, nil, False,
NORMAL_PRIORITY_CLASS, nil, nil,
vStartupInfo, vProcessInfo) then
Result := WaitForSingleObject(vProcessInfo.hProcess, ATimeout)
else Result := GetLastError;
end;
例如有些系统自带的程序,在xp和2000下就不一样,比方说netmeeting,一个好像是在winnt下,一个是在windows目录下。
var t:integer;
begin
t:=GetTickCount;
while (FindWindow(0,pchar(cap))=0) and (GetTickCount-t<chao)
do Application.ProcessMessages;
result:=FindWindow(0,pchar(cap));
end;procedure TForm1.Button1Click(Sender: TObject);
var h:HWND;
begin
WinExec('calc',1);
//动态分配时间等待程序启动完毕并返回它的窗口句柄。
//如果启动程序速度非常慢,最长等待10秒后强制返回:
h:=pause('计算器',10000);
showmessage('窗口句柄:'+inttostr(h));end;问题三:
//创建进程并杀掉它
procedure TForm1.Button2Click(Sender: TObject);
var
si:STARTUPINFO;
pi:PROCESS_INFORMATION;
begin
FillChar(si, SizeOf(si),0);
si.dwFlags := STARTF_USESHOWWINDOW;
si.cb:=SizeOf(si);
si.wShowWindow := SW_Show;
CreateProcess(0,'calc.exe',nil, nil, False,NORMAL_PRIORITY_CLASS, nil, nil,si,pi);
CloseHandle(pi.hProcess);
Sleep(3000);//等待3秒后杀掉进程:
TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS,FALSE,pi.dwProcessId),0);//一行代码杀死成功
end;你在6楼的新问题:可以用GetSystemDirectory或GetWindowsDirectory获取系统文件夹。
特殊文件夹比如回收站或者IE临时目录或者程序目录,也有API可以动态获取,不过那是另一个新问题了。
问题二比较麻烦。暂不予解决!
GetWindowsDirectory() api来获得
当然这个方法就是需要conf.exe本身支持