Mirror

Tile the open windows when calling an external application from your program (Views: 102)


Problem/Question/Abstract:

I want to execute an external program from my Delphi application when I click on a button. However, when the program is executed, I want both my Delphi application and the external program to tile side by side (just like in Windows own "Tile windows") vertically.

Answer:

The problem boils down to finding the started programs window handle. Once you have that the tiling boils down to a single call to the TileWIndow API function. The following is starting an application and tiling its window with the current application window.

procedure StartAppAndTileWindows(const appname: string; const windows: array of HWND;
  tileHorizontal: Boolean = true);
const
  tileflags: array[Boolean] of UINT = (MDITILE_VERTICAL, MDITILE_HORIZONTAL);
var
  currhwnd: HWND;
  newhwnd: HWND;
  counter: Integer;
  wndArray: array of HWND;
begin
  currhwnd := GetForegroundWindow;
  if ShellExecute(currhwnd, nil, Pchar(appname), nil, nil, SW_SHOWNORMAL) > 32 then
  begin
    counter := 0;
    repeat
      Sleep(100);
      newhwnd := GetForegroundWindow;
      if (newhwnd <> 0) and (newhwnd <> currhwnd) then
      begin
        SetLength(wndArray, High(windows) + 2);
        Move(windows[0], wndArray[0], (High(windows) + 1) * sizeof(HWND));
        wndArray[High(wndArray)] := newhwnd;
        TileWindows(0, {tile on desktop}
          tileflags[tileHorizontal], {mode as per param}
          nil, {use desktops full client area}
          Length(wndArray), {count of windows to tile}
          @wndArray[0]); {array of window handles to tile}
        Exit;
      end
      else
        Inc(counter);
    until
      counter >= 20;
    raise Exception.CreateFmt('Could not find main window of %s', [appname]);
  end;
  raise Exception.CreateFmt('Could not execute %s', [appname]);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  StartAppAndTileWindows('notepad.exe', [handle]);
end;

<< Back to main page