欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Delphi實(shí)現窗體內嵌其他應用程序窗體

[代碼]Delphi實(shí)現窗體內嵌其他應用程序窗體

實(shí)現原理是啟動(dòng)一個(gè)應用程序,通過(guò)ProcessID得到窗體句柄,然后對其設定父窗體句柄為本程序某控件句柄(本例是窗體內一個(gè)Panel的句柄),這樣就達成了內嵌的效果。

本文實(shí)現的是內嵌一個(gè)記事本程序,如下圖:

在實(shí)現細節上需要注意幾點(diǎn)

  1. 為了美化程序的嵌入效果,需要隱藏其標題欄
  2. 在外部窗體大小變化時(shí),需要內嵌的窗體也隨之變化大小
  3. 外部程序退出時(shí),內嵌的程序也要退出

下面是例子程序。新建窗體,上面放置一個(gè)Panel控件,名為pnlApp,然后按下面代碼編寫(xiě):

unit frmTestEmbedApp;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;
 
type
 
  TForm1 = class(TForm)
    pnlApp: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormResize(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  hWin: HWND = 0;
 
implementation
 
{$R *.dfm}
 
type
  // 存儲窗體信息
  PProcessWindow = ^TProcessWindow;
  TProcessWindow = record
    ProcessID: Cardinal;
    FoundWindow: hWnd;
  end;
 
// 窗體枚舉函數
 
function EnumWindowsProc(Wnd: HWND; ProcWndInfo: PProcessWindow): BOOL; stdcall;
var
  WndProcessID: Cardinal;
begin
  GetWindowThreadProcessId(Wnd, @WndProcessID);
  if WndProcessID = ProcWndInfo^.ProcessID then begin
    ProcWndInfo^.FoundWindow := Wnd;
    Result := False;                                    // 已找到,故停止 EnumWindows
  end
  else
    Result := True;                                     // 繼續查找
end;
 
// 由 ProcessID 查找窗體 Handle
 
function GetProcessWindow(ProcessID: Cardinal): HWND;
var
  ProcWndInfo: TProcessWindow;
begin
  ProcWndInfo.ProcessID := ProcessID;
  ProcWndInfo.FoundWindow := 0;
  EnumWindows(@EnumWindowsProc, Integer(@ProcWndInfo)); // 查找窗體
  Result := ProcWndInfo.FoundWindow;
end;
 
// 在 Panel 上內嵌運行程序
 
function RunAppInPanel(const AppFileName: string; ParentHandle: HWND; var WinHandle: HWND): Boolean;
var
  si: STARTUPINFO;
  pi: TProcessInformation;
begin
  Result := False;
 
  // 啟動(dòng)進(jìn)程
  FillChar(si, SizeOf(si), 0);
  si.cb := SizeOf(si);
  si.wShowWindow := SW_SHOW;
  if not CreateProcess(nil, PChar(AppFileName), nil, nil, true,
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, si, pi) then Exit;
 
  // 等待進(jìn)程啟動(dòng)
  WaitForInputIdle(pi.hProcess, 10000);
 
  // 取得進(jìn)程的 Handle
  WinHandle := GetProcessWindow(pi.dwProcessID);
  if WinHandle > 0 then begin
    // 設定父窗體
    Windows.SetParent(WinHandle, ParentHandle);
 
    // 設定窗體位置
    SetWindowPos(WinHandle, 0, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOZORDER);
 
    // 去掉標題欄
    SetWindowLong(WinHandle, GWL_STYLE, GetWindowLong(WinHandle, GWL_STYLE)
      and (not WS_CAPTION) and (not WS_BORDER) and (not WS_THICKFRAME));
 
    Result := True;
  end;
 
  // 釋放 Handle
  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);
end;
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  // 退出時(shí)向內嵌程序發(fā)關(guān)閉消息
  if hWin > 0 then PostMessage(hWin, WM_CLOSE, 0, 0);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
const
  App = 'C:\Windows\Notepad.exe';
begin
  pnlApp.Align := alClient;
 
  // 啟動(dòng)內嵌程序
  if not RunAppInPanel(App, pnlApp.Handle, hWin) then ShowMessage('App not found');
end;
 
procedure TForm1.FormResize(Sender: TObject);
begin
  // 保持內嵌程序充滿(mǎn) pnlApp
  if hWin <> 0 then MoveWindow(hWin, 0, 0, pnlApp.ClientWidth, pnlApp.ClientHeight, True);
end;
 
end.

這種方式也存在幾個(gè)問(wèn)題:

問(wèn)題1:如果程序有Splash窗體先顯示,則實(shí)際窗體無(wú)法內嵌,因為僅將Splash窗體的父窗體設定為本程序的控件句柄,后續窗體無(wú)法設定。

解決方法:可以通過(guò)輪詢(xún)方式查詢(xún)后續窗體,并設定其父窗體為本程序的控件句柄。

問(wèn)題2:點(diǎn)擊內嵌程序的窗體,則本程序的標題欄失去焦點(diǎn)

解決方法:不詳。

問(wèn)題3:點(diǎn)擊內嵌程序的窗體,按下ALT+F4,則內嵌程序退出,僅留下本程序

解決方法:可以通過(guò)Hook方式攔截ALT+F4。

愛(ài)生活,愛(ài)拉風(fēng)
分類(lèi): Delphi

博主后一篇:[筆記](méi)如何屏蔽視頻網(wǎng)站的片頭廣告——優(yōu)酷
posted @ 2011-07-21 23:48 ET民工[源自火星] 閱讀(1169) 評論(12) 編輯 收藏
#1樓 2011-08-15 13:39 vcc  

請教 ET民工
我若改執行其他exe
1.
'C:\Windows\system32\mspaint.exe';
'C:\Windows\system32\calc.exe';
加sleep(500) 還可以include 進(jìn)來(lái)

但'C:\Program Files\Internet Explorer\iexplore.exe';
就有點(diǎn)難

2.我另外自己寫(xiě)的exe 被include後,在下面的windows的工作列,會(huì )像一般exe一樣有ICON 出現,這能將他 隱藏嗎?像記事本就不會(huì )出現
#2樓[樓主] 2011-08-15 16:06 ET民工[源自火星]  
@vcc
1.
'C:\Windows\system32\mspaint.exe';
'C:\Windows\system32\calc.exe';
加sleep(500) 還可以include 進(jìn)來(lái)

但'C:\Program Files\Internet Explorer\iexplore.exe';
就有點(diǎn)難

不建議嵌入IE,建議使用WebBrowser控件

2.我另外自己寫(xiě)的exe 被include後,在下面的windows的工作列,會(huì )像一般exe一樣有ICON 出現,這能將他 隱藏嗎?像記事本就不會(huì )出現

可以參考這篇文章,不過(guò)我沒(méi)有測試,僅供參考吧:
利用ITaskbarList接口隱藏任務(wù)欄圖標
http://blog.csdn.net/3150379/article/details/3169335

#3樓 2011-08-15 17:15 vcc  
感謝指導
2個(gè)方法都未能成功

利用ITaskbarList接口隱藏任務(wù)欄圖標 只能隱藏 主程序application.handle


而是要內嵌delphi 寫(xiě)的exe,,
不要讓內嵌的exe ICON 出現在下方任務(wù)檔
(利用ITaskbarList接口隱藏任務(wù)欄圖標)
未能成功

#6樓[樓主] 2011-08-17 11:45 ET民工[源自火星] 
@vcc
如果內嵌的程序是你自己寫(xiě)的,可以將其主窗體直接當作外殼程序的子窗體,這樣就沒(méi)問(wèn)題了。我的一個(gè)程序就這么做的,運行良好。
或者將內嵌的程序修改為運行時(shí)不顯示在任務(wù)欄按鈕里,這樣可以達到目的,當然,前提是你可以修改內嵌程序的代碼。

#7樓 2011-08-17 12:20 vcc  
1.內嵌的程序是自己寫(xiě)的,但是我要他成為單一exe,而不要為MDI 子視窗方式,,我要用外殼程序 一次遙控多個(gè)同樣的exe,
exe可以同時(shí)同步運行,,
MDI子視窗無(wú)法實(shí)現同時(shí)同步運行

2.最好是 A.像記事本一樣 ,一般exe 內嵌後,不顯示在任務(wù)欄按鈕里
(包括任何delphi exe[我內嵌他人寫(xiě)的delphi TILED.exe 也一樣會(huì )顯示,所以我懷疑delphi exe 比較特殊])

B.要如何 內嵌的程序修改為運行時(shí)不顯示在任務(wù)欄按鈕里

#8樓[樓主] 2011-08-17 12:32 ET民工[源自火星]  

我的做法不是使用MDI(MDI已經(jīng)過(guò)時(shí)了),如下:
1、外殼程序只做外殼的界面,但是里面有個(gè)PageControl控件,每一頁(yè)是一個(gè)子窗體的容器。
2、初始化外殼程序時(shí),讀取配置文件,初始化每個(gè)子窗體程序
3、外殼程序可以通過(guò)Notify模式和子窗體交互,說(shuō)白了就是雙向廣播
4、子窗體因為是Form級的被調用,所以和主窗體是完整的一個(gè)程序,不存在多余進(jìn)程

以上的基礎是,外殼和子窗體都是Delphi程序,都是源碼級別
#9樓 2011-08-17 13:13 vcc 
外殼將多個(gè)子窗體定義為窗體數組。
同時(shí)控制,可以通過(guò)遍歷數組每一項來(lái)發(fā)送指令和獲取回復。
外殼程序 用PageControl 將子視窗 分頁(yè)管理?
外殼程序 若是sendmessage 給所有子視窗(子視窗內的程序是獨立執行緒嗎?)
我的子程式是控制USB,,我利用外殼程序 同時(shí) 同步控制多個(gè)子程序(多個(gè)USB)

我試過(guò)MDI 將控制USB作成子Form,,但發(fā)現 只能有單一子視窗運作,,
所以往Thread 跟 外殼程序 2方面找資料,,
未嘗試 Thread我的[控制USB](擔心debug...)
剛好找到了 樓主這篇,,用了幾天 大致都能得到我的預期需求
現在就是 任務(wù)欄按鈕 會(huì )顯示出來(lái) 處理不來(lái),,



本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Delphi:實(shí)現無(wú)邊界窗體的移動(dòng)
Delphi融合DLL中的窗體
第一章 Delphi快速入門(mén)(一)
Delphi制作DLL
如何在自己的系統中打開(kāi)并關(guān)閉外部程序
DELPHI的美化插件VCLskin5.6
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久