外部程序嵌套到自己的程序内,并隐藏外部的任务栏显示问题【求助】本帖最后由 xingyu198932 于 2012-12-13 00
外部程序嵌套到自己的程序内,并隐藏外部的任务栏显示问题【求助】
本帖最后由 xingyu198932 于 2012-12-13 00:07:25 编辑 我这里有a.exe文件是别人做的。我想把它嵌入到我的窗体里面成为窗体的一部分。
用了佬哥的案例,把计算器嵌套在自己的窗体内,代码如下:
var
hwndOldParent,hwndCalc:HWND;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Windows.SetParent(hwndCalc,hwndOldParent);//恢复计算器的原有宿主
end;
procedure TForm1.Button1Click(Sender: TObject);//绑架计算器
begin
hwndCalc:=FindWindow(nil,'计算器'); //找计算器窗体
if hwndCalc=0 then winexec('calc.exe',SW_SHOWNORMAL);//如果未找到就运行计算器
hwndCalc:=FindWindow(nil,'计算器'); //再找计算器窗体
hwndOldParent:=GetParent(hwndCalc);//获取它的宿主(待进程结束时恢复它的原有宿主)
Windows.SetParent(hwndCalc,Handle);//将计算器绑架入自己的窗体
end;
计算器成功的显示在窗体内,并且任务栏没有计算器的任务显示,释放后计算器显示在任务栏。可问题是
我自己吧a.exe嵌套进去后,a.exe会在任务栏显示,看的非常假,一看就是2个程序
我需要a.exe隐藏在任务栏隐藏,怎么办呢?
我发现只要是windos自带的记事本、牌、计算器等,嵌入后都不会在任务栏显示,其他程序都不行,会显示。
求解
[解决办法]红色的是新增加的代码:
function FindMainWindow(h: HWND): HWND;
var
hParent, hOwner: HWND;
begin
hParent := h;
repeat
Result := hParent;
hParent := Windows.GetParent(hParent);
until hParent = 0;
hOwner := Result;
repeat
Result := hOwner;
hOwner := Windows.GetWindow(hOwner, GW_OWNER)
until hOwner = 0
end;
var
hwndOldParent,hwndCalc,hwndCalcMain:HWND;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Windows.SetParent(hwndCalc,hwndOldParent);//恢复计算器的原有宿主
end;
procedure TForm1.Button1Click(Sender: TObject);//绑架计算器
begin
hwndCalc:=FindWindow(nil,'计算器'); //找计算器窗体
if hwndCalc=0 then winexec('calc.exe',SW_SHOWNORMAL);//如果未找到就运行计算器
hwndCalc:=FindWindow(nil,'计算器'); //再找计算器窗体
hwndCalcMain:=FindMainWindow(hwndCalc);
if (hwndCalcMain <> 0) and (hwndCalcMain <> hwndCalc) then
ShowWindow(hwndCalcMain, SW_HIDE);
hwndOldParent:=GetParent(hwndCalc);//获取它的宿主(待进程结束时恢复它的原有宿主)
Windows.SetParent(hwndCalc,Handle);//将计算器绑架入自己的窗体
end;