Dem Problem der unterschiedlichen Auflösungen wird meist zu wenig Beachtung geschenkt: Der Programmierer arbeitet mit »seiner« Auflösung. Zudem ist das Testen anderer Auflösungen auch mühsam: Die Auflösung des Monitors wirft Desktopsymbole und Fenstergrößen anderer Anwendungen quer durcheinander.

Screenshot des Tools »Application Resolution«

Screenshot des Tools »Application Resolution«

Abhilfe schafft hier das gezielte Versetzen der Anwendung in die gewünschte Auflösung. Das Ziehen mit der Maus auf die gewünschte Fenstergröße ist zwar ebenso mühsam, aber mit einem kleinen Programm genügt der sprichwörtliche Klick.

Die Auswahl des Zielfensters geschieht sehr einfach: Der Anwender macht das Fenster aktiv und drückt auf der Tastatur den globalen Shortcut Strg+F7, der beim Programmstart reserviert wird.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function dlgfunc(hDlg: hWnd; uMsg: dword; wParam: wParam;
  lParam: lParam): bool; stdcall;
begin
  result := true;
  case uMsg of
    WM_INITDIALOG:
    begin
      // [...]
      If not RegisterHotkey(hDlg, IDC_HOTKEY, MOD_CONTROL, 118)
      then begin
        MessageBox(hDlg,
          'Der für das Programm benötigte Hotkey Strg+F7 ist '+
          'bereits durch das System belegt. Das Programm kann '+
          'daher nicht starten.', 'Hotkey belegt',
          MB_OK or MB_ICONERROR);
        Halt(1);
      end;
    end;
    WM_CLOSE:
    begin
      UnregisterHotKey(hDlg, IDC_HOTKEY);
      PostQuitMessage(0);
    end;
    WM_HOTKEY:
    begin
      If (wParam = IDC_HOTKEY) then GetProgWnd(hDlg);
    end;
    // [...]
  end;
end;

Die Funktion GetProcWnd holt sich das Handle des aktiven Fensters mit GetForegroundWindow, liest den Fenstertitel mit GetWindowText und trägt beide Daten in die passenden Labels ein, damit der Anwender eine optische Rückmeldung hat.

1
2
3
4
5
6
7
8
9
procedure GetProgWnd(hDlg: hWnd);
var
  szName: Array[0..255] of Char;
begin
  DestWnd := GetForegroundWindow;
  SetDlgItemInt(hDlg, IDC_LA_APPHANDLE, DestWnd, False);
  GetWindowText(DestWnd, szName, 256);
  SetDlgItemText(hDlg, IDC_LA_APPNAME, @szName);
end;

Die Funktion SetNewRes setzt die neue Fenstergröße: In einer Case-Anweisung wird geprüft, welcher Button betätigt wurde und auf die entsprechende Fenstergröße umgeschaltet. Dies erledigt die API-Funktion SetWindowPos.

1
2
3
4
5
6
7
8
9
10
11
12
procedure SetNewRes(Btn: THandle; hDlg: hWnd);
var
  X, Y: Integer;
  bTranslated: LongBool;
begin
  Case Btn of
    // [...]
    IDC_1024:
      SetWindowPos(DestWnd, 0, 0, 0, 1024, 768, SWP_NOZORDER);
    // [...]
  end;
end;

Eine Erleichterung für den Anwender ist die Möglichkeit, das Fenster im Vordergrund zu halten. Dies erledigt die Funktion SetTopmost, die ihrerseits auf die schon bekannte API-Funktion SetWindowPos zurückgreift, das Interessante dabei ist der Parameter HWND_TOPMOST.

1
2
3
4
5
6
7
8
9
procedure SetTopmost(hDlg: hWnd);
begin
  If SendMessage(GetDlgItem(hDlg, IDC_CB_TOPMOST),
       BM_GETCHECK, 0, 0) = BST_CHECKED
    then SetWindowPos(hDlg, HWND_TOPMOST, 0, 0, 0, 0,
         SWP_DRAWFRAME or SWP_NOMOVE or SWP_NOSIZE)
    else SetWindowPos(hDlg, HWND_NOTOPMOST, 0, 0, 0, 0,
         SWP_DRAWFRAME or SWP_NOMOVE or SWP_NOSIZE);
end;

Download

Anwendung AppResolution.exe (22 KB)
Quelltext des Programms (7 KB)