我使用WINEXEC来启动一个程序,然后用FINDWINDOWS句柄来确定一个是否已经启动,如果启动就进行相关操作。
但是这个程序比较大,需要启动许久,故FINDWINDOWS找到主窗口体的时候,也许WINEXEC启动的程序并没有完成,所以相关操作都是白操作。
请问有什么办法或思路能解决这个问题呢。
但是这个程序比较大,需要启动许久,故FINDWINDOWS找到主窗口体的时候,也许WINEXEC启动的程序并没有完成,所以相关操作都是白操作。
请问有什么办法或思路能解决这个问题呢。
解决方案 »
- CXDBcombobox下拉中添加dbgrid中的一列内容?
- 如何在stringgrid的单元格中加入按钮?
- DBGRid的显示字段要求比数据集多了几个字段,如何解决。
- 如何将stringgrid中每列的数据居中显示?
- 从VB编程转过来的问题(关于TCOMBOBOX类VCL的使用)
- 关于李维的DELPHI电子商务篇的问题,
- 用C++写的下面的语句,在转换成DELPHI是总报错,那位大虾帮忙看看
- 在线等,高手请问?
- 300分谁要,绝对给!!!
- 一个N简单的问题,有人回答对立刻结贴 -关于Delphi的数据类型和API函数的匹配
- stringgrid dbgrid
- 请教bds2007和vs2005的帮助系统冲突的问题
hWin := FindWindow(类名,标题); while (hWin = 0) do
begin
Sleep(100);
Application.ProcessMessages;
hWin:= FindWindow(类名,标题);
end;如果你用CreateProcess的话,可以这样等待:
WaitForInputIdle(hProcess, INFINITE); // hProcess为创建的进程句柄
参与一下吧procedure TForm1.Button1Click(Sender: TObject);
type
//定义一个结构体,用来返回启动窗体的句柄
PFindData = ^TFindData;
TFindData = record
hProcess: THandle;
hWindow: THandle;
end; function EnumWindowsProc(Handle: THandle; lParam: LPARAM): Boolean; stdcall;
var
hProcess: THandle;
FindData: PFindData;
begin
Result := True; //继续枚举一下窗体
FindData := PFindData(lParam);
GetWindowThreadProcessId(Handle, hProcess); //取得窗体进程ID号
if hProcess = FindData^.hProcess then
begin
FindData^.hWindow := Handle; //已经找到!!
Result := False;
end;
end;var
FileName: string;
ProcessInfo: TProcessInformation;
StartUpInfo: TStartupInfo;
hButton: THandle;
AFindData: TFindData;
begin
FileName := ExtractFilePath(ParamStr(0)) + 'Project2.exe'; FillChar(StartUpInfo, SizeOf(StartUpInfo), $00);
StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;
StartUpInfo.wShowWindow := SW_SHOW; if CreateProcess(nil, PChar(FileName), nil, nil,
False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo,
ProcessInfo) then
begin
//等就直到另外一下程序都准备好了
WaitForInputIdle(ProcessInfo.hProcess, INFINITE); AFindData.hProcess := ProcessInfo.dwProcessId;
AFindData.hWindow := 0;
EnumWindows(@EnumWindowsProc, Integer(@AFindData));
if AFindData.hWindow <> 0 then
begin
hButton := FindWindowEx(AFindData.hWindow, 0, 'TButton', 'Button1');
if hButton <> 0 then
SendMessage(hButton, CN_COMMAND, BN_CLICKED, 0);
end; CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
end;
end;
这样的启动的时候窗口标题会变,也就是“正在连接服务器”待程序运行完成后再显示“已成功连接服务器”。
在
function EnumWindowsProc(Handle: THandle; lParam: LPARAM): Boolean; stdcall;
var
hProcess: THandle;
FindData: PFindData;
begin
Result := True; //继续枚举一下窗体
FindData := PFindData(lParam);
GetWindowThreadProcessId(Handle, hProcess); //取得窗体进程ID号
if hProcess = FindData^.hProcess then
begin
FindData^.hWindow := Handle; //已经找到!!
//根据句柄取类名以及标题,然后判断 Result := False;
end;
end;