How can I specify the window position of an external console program?
console-application, delphi
Solution
If you have control over the console application, You could set the console window position from inside the console application itself:
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.
If you can't recompile the console application, you could use `FindWindow('ConsoleWindowClass', '<path to the executable>')` to obtain the console window handle (the Title parameter could vary if it was set via `SetConsoleTitle`). The downside with this approach, is that the console window is seen "jumping" from it's default position to it's new position (tested with Windows XP).
Problem
In my Win32 VCL application I am using ShellExecute to launch a number of smaller Delphi console applications. Is there a way to control the position of those console windows? I would like to launch them centered on screen.