主程式呼叫子程式(web控制元件在子程式中),如何保證web表單顯示在主程式給定的視窗內?現在不得不采用綁架的方式,結果又導致頻繁出現脫離現象,而且綁架的方式也不能防假死。
難道delphi無法開發多行程瀏覽器?請問用什么方法實作對子程式的呼叫?確保web表單顯示在主程式給定的視窗內,不脫離,還能防假死。
uj5u.com熱心網友回復:
delphi多執行緒用過兩次,感覺沒有直接用時間控制元件控制簡單一些。看看能不能用其它的方式代替一下執行緒。uj5u.com熱心網友回復:
是多行程,不是多執行緒uj5u.com熱心網友回復:
有兩種方法:1、CreateProcess后,用個sleep等下;
2、用WaitForInputIdle
uj5u.com熱心網友回復:
什么叫“綁架的方式”?uj5u.com熱心網友回復:
有做過多行程的瀏覽器,創建行程后保留句柄,通過訊息進行控制
uj5u.com熱心網友回復:
但是有些登錄的網站在另一個行程中打開時會出現未登錄的狀態uj5u.com熱心網友回復:
其實有一個比較好的方法,如果能獲取到子行程中主表單的handle,那么說明子行程的主表單創建完畢。
while GetProcessWindow(ProcessInfo.dwProcessID)=0 do
begin
Application.ProcessMessages;
Sleep(10);
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;
uj5u.com熱心網友回復:
以上解決方法適用于:子表單脫離原因是子表單沒有創建完畢。uj5u.com熱心網友回復:
function CreateProcess(lpApplicationName: PChar; lpCommandLine: PChar;lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
lpCurrentDirectory: PChar; const lpStartupInfo: TStartupInfo;
var lpProcessInformation: TProcessInformation): BOOL; stdcall;
使用CreateProcess創建子行程,得到行程id
使用@whhitxjl提供的函式GetProcessWindow回傳主表單句柄
使用Windows.SetParent賜予它父子關系;
function SetParent(hWndChild, hWndNewParent: HWND): HWND; stdcall;
這樣可以做到一個行程的表單在另一個行程表單中顯示;
瀏覽器防假死我也想知道啊,期待樓下大蝦會有這方面的回復!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/140946.html
標籤:VCL組件開發及應用
上一篇:如何控制(切換)其他程式的輸入法
下一篇:求助。北京人來
