12

Win32 VCLアプリケーションでは、ShellExecuteを使用して、多数の小さなDelphiコンソールアプリケーションを起動しています。それらのコンソールウィンドウの位置を制御する方法はありますか?画面を中心に起動したいと思います。

4

2 に答える 2

19

CreateProcessウィンドウのサイズと位置は、そのSTARTUPINFO構造パラメータで使用および指定できます。次の関数例では、コンソールウィンドウのサイズを指定できます。これは、現在のデスクトップを中心とした指定されたサイズに従います。この関数は、成功した場合はプロセスハンドルを返し、それ以外の場合は0を返します。

function RunConsoleApplication(const ACommandLine: string; AWidth,
  AHeight: Integer): THandle;
var
  CommandLine: string;
  StartupInfo: TStartupInfo;
  ProcessInformation: TProcessInformation;
begin
  Result := 0;
  FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
  FillChar(ProcessInformation, SizeOf(TProcessInformation), 0);
  StartupInfo.cb := SizeOf(TStartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USEPOSITION or 
    STARTF_USESIZE;
  StartupInfo.wShowWindow := SW_SHOWNORMAL;
  StartupInfo.dwXSize := AWidth;
  StartupInfo.dwYSize := AHeight;
  StartupInfo.dwX := (Screen.DesktopWidth - StartupInfo.dwXSize) div 2;
  StartupInfo.dwY := (Screen.DesktopHeight - StartupInfo.dwYSize) div 2;
  CommandLine := ACommandLine;
  UniqueString(CommandLine);
  if CreateProcess(nil, PChar(CommandLine), nil, nil, False,
    NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInformation)
  then
    Result := ProcessInformation.hProcess;
end;
于 2012-08-27T10:13:27.967 に答える
12

コンソールアプリケーションを制御できる場合は、コンソールアプリケーション自体の内部からコンソールウィンドウの位置を設定できます。

program Project1;
{$APPTYPE CONSOLE}
uses
  Windows,
  MultiMon;

function GetConsoleWindow: HWND; stdcall; external kernel32 name 'GetConsoleWindow';

procedure SetConsoleWindowPosition;
var
  ConsoleHwnd: HWND;
  R: TRect;
begin
  ConsoleHwnd := GetConsoleWindow;
  // Center the console window
  GetWindowRect(ConsoleHwnd, R);
  SetWindowPos(ConsoleHwnd, 0,
    (GetSystemMetrics(SM_CXVIRTUALSCREEN) - (R.Right - R.Left)) div 2,
    (GetSystemMetrics(SM_CYVIRTUALSCREEN) - (R.Bottom - R.Top)) div 2,
    0, 0, SWP_NOSIZE);
end;

begin
  SetConsoleWindowPosition;  
  // Other code...
  Readln;
end.

コンソールアプリケーションを再コンパイルできない場合はFindWindow('ConsoleWindowClass', '<path to the executable>')、コンソールウィンドウハンドルを取得するために使用できます(タイトルパラメータは、を介して設定された場合は異なる可能性がありますSetConsoleTitle)。このアプローチの欠点は、コンソールウィンドウがデフォルトの位置から新しい位置に「ジャンプ」しているように見えることです(Windows XPでテスト済み)。

于 2012-08-27T09:52:19.247 に答える