喫茶XRAYトップページ

[スレッド全体
]

[10978] Re:起動したアプリをTOPMOSTにする返信 削除
2017/3/28 (火) 21:48:42 Mr.XRAY
> サンプルのコードは,新規にブラウザを起動することを前提にしています.

起動中のブラウザに対応したコードを追加しました.
ただし,IE11 は起動中のウィンドウに対して操作しても TOPMOST になりません.

[plBrowseURL_TOPMOST.zip]  1,160 KB
http://mrxray.on.coocan.jp/Delphi/zip/plBrowseURL_TOPMOST.zip

起動中のブラウザのハンドルの取得は,以下のコードを使用しています.


//-----------------------------------------------------------------------------
//  指定プロセスの起動をチェック
//  戻り値はそのプロセスのウィンドウのハンドル値
//  Toolhelp32Snapshotを使用する方法
//
//  CreateToolhelp32Snapshotの使用には,usesにTlhelp32が必要
//-----------------------------------------------------------------------------
function TForm1.CheckRunExe(RunExeName: string): THandle;
const
  MAX_PROCCOUNT = 2048;
  PROCESS_QUERY_LIMITED_INFORMATION = $1000;
  PROCESS_NAME_NATIVE = 1;
var
  LListHandle : THandle;
  LProcEntry  : TProcessEntry32;
  LProcessID  : DWORD;
  LTargetWnd  : THandle;
  LExePath    : String;
begin
  Result := 0;
  //デバッグの特権を有効にする
  Privilege.SetPrivilege(SE_DEBUG_NAME, True);

  //プロセスのスナップショットのハンドルを取得
  LListHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if LListHandle > 0 then begin
    try
      //最初のプロセスに関する情報をTProcessEntry32レコード型に取得
      LProcEntry.dwSize := SizeOf(TProcessEntry32);
      Process32First(LListHandle, LProcEntry);
      repeat
        //パス名とプロセスIDを取得
        LExePath := LProcEntry.szExeFile;

        if LowerCase(LExePath) = LowerCase(RunExeName) then begin
          LProcessID := LProcEntry.th32ProcessID;
          LTargetWnd := LProcessID;
          EnumWindows(@EnumTopWindow, LPARAM(@LTargetWnd));
          if LTargetWnd <> LProcessID then begin
            Result := LTargetWnd;
            Break;
          end;
        end;

      //次のプロセスに関する情報をTProcessEntry32レコード型に取得
      until Process32Next(LListHandle, LProcEntry) = False;
    finally
      CloseHandle(LListHandle);
    end;
  end;
end;


[10979] Re2:起動したアプリをTOPMOSTにする返信 削除
2017/3/28 (火) 22:37:00 Mr.XRAY
▼ Mr.XRAYさん
 
> 起動中のブラウザに対応したコードを追加しました.
> ただし,IE11 は起動中のウィンドウに対して操作しても TOPMOST になりません.


ハイ.また追加しました.
今度は,自分で起動したブラウザが終了まで待つサンプルです.
「自分で起動して」ですから,既に起動中の場合は何もしません.
>
[plBrowseURL_TOPMOST.zip]  1,697 KB
http://mrxray.on.coocan.jp/Delphi/zip/plBrowseURL_TOPMOST.zip



[10980] Re3:起動したアプリをTOPMOSTにする返信 削除
2017/3/28 (火) 23:10:14 Mr.XRAY
ハイ.さらに追加しました.

今度は,ブラウザの終了を自動検出します.
WMI のイベントシンクを使用しています.
 
[plBrowseURL_TOPMOST.zip]  2,336 KB
http://mrxray.on.coocan.jp/Delphi/zip/plBrowseURL_TOPMOST.zip

イベントシンクのコードは以下のようになっています.

//-----------------------------------------------------------------------------
//  TSWbemSinkのOnObjectReadyイベントのコード
//  イベントの宣言部と,この実装部はWbemScripting_TLBのコードをコピペ
//-----------------------------------------------------------------------------
procedure TForm1.EventOnObjectReady(ASender: TObject;
  const objWbemObject: ISWbemObject;
  const objWbemAsyncContext: ISWbemNamedValueSet);
var
  LPropVal   : OleVariant;
  LPropValue : OleVariant;
  LText      : string;
begin
  LPropVal   := objWbemObject;
  LPropValue := LPropVal.TargetInstance;

  if VarToStr( LPropVal.Path_.Class) = '__InstanceDeletionEvent' then begin
    if FCloseDlgFlag = False then begin
      FCloseDlgFlag := True;
      LText := 'ブラウザが閉じられました';
      MessageBox(Handle, PChar(LText), '情報', MB_ICONINFORMATION);

      SetActiveWindow(Handle);
      SetForegroundWindow(Handle);
    end;
  end;
end;


UP したサンプルコードは,当サイトのサンプル記事のコードをコピペ
して,少し修正を加えだものでごさいます.



[▼次のスレッド]
INCM/CMT
Cyclamen v3.82