C ++ CreateProcess SW_Hide Firefox、Chrome、Safari
-
09-10-2019 - |
質問
複数のブラウザを使用してWebアプリをテストするWindowsのWebテストフレームワークを作成しています。非表示にブラウザを起動したいのですが、機能していません。
createProcessを使用してSW_HIDEフラグでブラウザを起動します
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
CreateProcess(NULL, const_cast<char*> (cmd.c_str()) , NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
Internet Explorerやその他のアプリでは正常に機能しますが、Firefoxやその他のブラウザでは失敗します。私は、プロセスが通過したフラグに従うかどうかを選択できることを知っています。私がそれを強制して隠し始めることができる方法はありますか?
おそらく、窓が現れるまで待ってから、開いたウィンドウにハンドルをつけて隠すことができます。しかし、私はよりクリーンなソリューションを探しています。
解決
問題は、の価値です wShowWindow
関数の場合にのみ使用されます ShowWindow
コマンドで呼び出されます SW_SHOWDEFAULT
, さらに、Fastalが言ったように、ブラウザは追加のタスクを実行するための追加のプロセスを作成します。
あなたのアイデアとFastalの答えに基づいて、あなたが作成したプロセスによって作成されたウィンドウを隠すためにこれを行うことができます:
1.-プロセスのリストを作成します。 CreateToolhelp32Snapshot
, Process32First
, Process32Next
と CloseHandle
;作成したプロセスによって作成されたプロセスのみを実行します。 ここ この関数の使用方法のデモストレーションであり、Windows NTを除くWindowsバージョンで動作します。
2.-使用 EnumWindows
画面上のWindowsを列挙して列挙します GetWindowThreadProcessId
前のステップで回復したプロセスのいずれかによってウィンドウが作成されたかどうかを確認してください。
3.-ステップ1で定義されているプロセスの1つによってウィンドウが作成された場合。 ShowWindow関数を使用してWindowsを非表示にします。
作成したプロセスを監視し、新しいプロセス/Windowsが作成されているかどうかを確認できます。
他のヒント
サービスからプロセスを起動できます(たとえば、ネットワークサービスユーザーとして実行されます)。これにより、UIが表示されなくなります。ただし、後でしたい場合でも、UIをまったく見ることができなくなります。
別のオプションは、ウィンドウステーションとデスクトップで何かをすることです。 MSDNのウィンドウステーションとデスクトップに関するセクション. 。アイデアは使用することです createdesktop 次に、このデスクトップを、createProcessに与えられたstartupInfo構造のLPDeskTopパラメーターとして指定します。後でUIを表示したい場合は、使用してください SwitchDesktop.
si.wshowwindow = 0をお試しください。面白いのは、これが私のためにうまくいったが、同じ値を持つはずのsw_hideではなく、私にとってはうまくいった。
アプリケーションを起動してから、メインウィンドウにwm_sizeメッセージを送信できます。
http://msdn.microsoft.com/en-us/library/ms632646(v=vs.85).aspx
によると MSDN, 、このフラグをDWFLAGSで渡す必要があるようです。
STARTF_USESHOWWINDOW 0x00000001 - The wShowWindow member contains additional information.