Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何指定外部控制台程序的窗口位置?_Delphi_Console Application - Fatal编程技术网

Delphi 如何指定外部控制台程序的窗口位置?

Delphi 如何指定外部控制台程序的窗口位置?,delphi,console-application,Delphi,Console Application,在我的Win32 VCL应用程序中,我使用ShellExecute来启动一些较小的Delphi控制台应用程序。有没有办法控制这些控制台窗口的位置?我想把它们集中在屏幕上 如果您可以控制控制台应用程序,则可以从控制台应用程序内部设置控制台窗口位置: program Project1; {$APPTYPE CONSOLE} uses Windows, MultiMon; function GetConsoleWindow: HWND; stdcall; external kernel32

在我的Win32 VCL应用程序中,我使用ShellExecute来启动一些较小的Delphi控制台应用程序。有没有办法控制这些控制台窗口的位置?我想把它们集中在屏幕上

如果您可以控制控制台应用程序,则可以从控制台应用程序内部设置控制台窗口位置:

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','')
获取控制台窗口句柄(如果通过
SetConsoleTitle
设置,则Title参数可能会有所不同)。 这种方法的缺点是控制台窗口从默认位置“跳跃”到新位置(使用Windows XP进行测试)。

您可以在其结构参数中使用并指定窗口大小和位置。在下面的示例函数中,您可以指定控制台窗口的大小,然后根据以当前桌面为中心的指定大小来指定。函数返回进程句柄,如果成功,则返回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;

您可以重新编译Delphi控制台应用程序吗?您可以通过
GetConsoleWindow
SetWindowPos
…@kobik获得控制台窗口的句柄,我可以重新编译,因此在我的所有控制台应用程序中,我应该在任何代码之前使用这个GetConsoleWindow和SetWindowPos序列?是的。我看到的唯一缺陷是控制台窗口正在“跳转”到它的新位置。@kobik,那么您可以使用并指定它的结构。将控制台输出重定向到您自己的窗口怎么样?