怎样打开其他程序,且以子窗口的形式打开。

bamboo2000 2011-05-12 08:33:06
怎样打开其他程序,且以子窗口的形式打开。
比如点击菜单1的时候在主窗口的Panel1中打开记事件
点击菜单2的时候在主窗口的Panel2中打开浏览器
......
...全文
367 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bamboo2000 2011-05-15
  • 打赏
  • 举报
回复
我的代码就是那样子,系统是win732位的,si.wShowWindow=SW_SHOW的时候屏幕闪一下,si.wShowWindow=SW_hide的时候,即使ShowWindow(hwin, SW_MAXIMIZE)了窗口还是不显示出来,

还有一点我的notepad.exe用notepad2替换过了,不过我用wordpad.exe也是出现相同的情况。
xinghun61 2011-05-14
  • 打赏
  • 举报
回复
你的代码测试没有问题呀,下面是我调用你的代码写的

unit t1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, OleCtrls, SHDocVw, HTTPApp,
HTTPProd, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
BtnOpen: TButton;
PnlChild: TPanel;
procedure BtnOpenClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function GetHwndFromProcess(ProcessId: DWORD): HWND;
function _EnumWindowsProc(P_HWND: Cardinal; lParam: Cardinal): Boolean; stdcall;
var
PID: DWORD;
begin
GetWindowThreadProcessId(P_HWND, @PID);
if PCardinal(lParam)^ <> PID then
Result := True
else
begin
Result := False;
PCardinal(lParam+4)^ := P_HWND;
end;
end;
var
Buffer: array[0..1] of Cardinal;
begin
Result := 0;
Buffer[0] := ProcessId;
Buffer[1] := 0;
EnumWindows(@_EnumWindowsProc, Integer(@Buffer));
if Buffer[1] > 0 then Result := Buffer[1];
end;

procedure TForm1.BtnOpenClick(Sender: TObject);
var
si: TStartupInfo;
pi: TProcessInformation;
hWin: THandle;
begin
FillChar(si, Sizeof(si), #0);
si.cb := Sizeof(si);
si.dwFlags := STARTF_USESHOWWINDOW;
si.wShowWindow := SW_HIDE;
if CreateProcess(PChar('C:\Windows\Notepad.exe'), nil, nil, nil, false,
CREATE_NEW_CONSOLE, nil, nil, si, pi) then begin
WaitForInputIdle(pi.hProcess, INFINITE);
hWin := GetHwndFromProcess(pi.dwProcessId);
Windows.SetParent(hWin, PnlChild.Handle);
ShowWindow(hwin, SW_MAXIMIZE);
end;
end;

end.


至于你说的闪一下的问题,不知我对你的意思理解得对不对。
你先将si.wShowWindow赋值为SW_SHOW,然后,执行后面的程序,是这样吗?
如果是这样的话,那屏幕是肯定会闪的,估计你还没理解自己写的代码的含义,呵呵。
1. 在刚开始创建notepad时,我们并不希望notepad立刻显示出来,否则,这时他的窗体会单独显示,而不是作为主窗体的内嵌窗体(这一点是通过si.wShowWindow的设置实现的)
2. 然后,设置notepad的父窗体(Windows.SetParent(hWin, PnlChild.Handle))
3. 设好父窗体之后,就可以将notepad显示出来了(ShowWindow(hwin, SW_MAXIMIZE))。
你说的显示不出来,估计是上面第3步出现问题了,跟下代码吧。
浩南_哥 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bamboo2000 的回复:]

能解决屏幕会闪一下的问题吗?
[/Quote]
没有你说的闪一下的问题,我测试了下你的代码,很好用啊。
GetHwndFromProcess这个函数我是从
http://bbs.pediy.com/showthread.php?t=66186
上面找的,你在试试吧
bamboo2000 2011-05-13
  • 打赏
  • 举报
回复
能解决屏幕会闪一下的问题吗?
山东蓝鸟贵薪 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 m617105 的回复:]
以子窗体的形式打开,就得设置这些程序的parent,可以试试setparent设置parent,findwindow函数,具体参考msdn,里面有一些注意事项。
[/Quote]
同意,我也是这样实现的
bamboo2000 2011-05-12
  • 打赏
  • 举报
回复

begin
FillChar(si, Sizeof(si), #0);
si.cb := Sizeof(si);
si.dwFlags := STARTF_USESHOWWINDOW;
si.wShowWindow := SW_hide;
if CreateProcess(pchar('c:\windows\notepad.exe'), nil, nil, nil, false, CREATE_NEW_CONSOLE, nil, nil, si, pi) then begin
WaitForInputIdle(pi.hProcess, INFINITE);
hwin := GetHwndFromProcess(pi.dwProcessId);
windows.SetParent(hwin,form1.Handle);
showWindow(hwin,SW_MAXIMIZE);
end;
end;


为什么不显示呢? 把sw_hide换成sw_show之后屏幕总是闪一下?
xinghun61 2011-05-12
  • 打赏
  • 举报
回复
同意1楼的,通过CreateProcess创建进程,然后调用WaitForInputIdle等待进程启动完成,在调用FindWindow查找窗体
浩南_哥 2011-05-12
  • 打赏
  • 举报
回复
以子窗体的形式打开,就得设置这些程序的parent,可以试试setparent设置parent,findwindow函数,具体参考msdn,里面有一些注意事项。

1,183

社区成员

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

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