Cześć.

Kombninuje pod WinAPI i nie mogę ogarnąc dwóch rzeczy. Już kiedyś pytałem o coś podobnego chyba i wtedy @kAzek mi doradzał, ale z tworzeniem drugiego - ukrytego dialogu. Jednak tutaj tworzyć chcę pod WinAPI coś na wzór ukrytego okna jak pod VCL mamy TApplication. Potrzebne mi jest to po to, by pasek tytułowy aplikacji nie zmieniał swojego tytułu.

To działa połowicznie. Jednak okno dialogowe nie reaguje na komunikat WM_KEYDOWN, a na tym mi też zależy. Prosił bym o pomoc i przykładowe kody jak rozwiązać problem. Wygooglowana porada aby raz jeszcze subclassowac - nie wiedzieć po co - okno dialogowe nie pomogło. Mam taki kod (wycinek):

procedure ShowDialogThreadProc(Param : Pointer) stdcall;
var
  Msg : TMsg;
  DlgH : HWND;
begin
  DlgH := DialogBox(HInstance, MAKEINTRESOURCE(IDC_MAINDLG), AppWindowHandle, @MainDlgProc);
  while GetMessage(Msg, 0, 0, 0) do
  begin
    if Msg.Message = WM_KEYDOWN then
    begin
      SendMessage(MainDialogHandle, Msg.Message, Msg.wParam, Msg.lParam);
    end;
    if not IsDialogMessage(DlgH, Msg) then
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
  end;
end;

function AppWndProc(AHWnd : HWND; Msg : UINT; WParam : WPARAM; LParam : LPARAM) : LRESULT; stdcall;
var
  ThrId : Cardinal;
begin
  Result := 0;
  case Msg of
    WM_CREATE :
      begin
        AppWindowHandle := AHWnd;
        HMainIcon := LoadIcon(HInstance, MAKEINTRESOURCE(IDI_MAINICON));
        SendMessage(AHWnd, WM_SETICON, 1, HMainIcon);
        CreateThread(nil, 0, @ShowDialogThreadProc, nil, 0, ThrId);
      end;
    WM_DESTROY :
      begin
        PostQuitMessage(0);
      end;
  else
    Result := DefWindowProc(AHWnd, Msg, WParam, LParam);
  end;
end;

var
  Msg : TMsg;
  Wnd : TWndClass;
begin
  with Wnd do
  begin
    HInstance := HInstance;
    lpfnWndProc := @AppWndProc;
    hbrBackground := COLOR_WINDOW;
    lpszClassName := App_ClassName;
  end;
  RegisterClass(Wnd);
  CreateWindow(App_ClassName, PChar(App_Title),
    WS_VISIBLE,
    GetSystemMetrics(SM_CXSCREEN) div 2,
    GetSystemMetrics(SM_CYSCREEN) div 2,
    0, 0, 0, 0, HInstance, nil);
  while GetMessage(Msg, 0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
end.

I do szczęścia potrzeba właśnie reakcji na WM_KEYDOWN co sprawdzałem odgrywanieniem Beep'ów i nic nie słychać. Dodatkowo chciałbym, jeśli się jakoś da, uzyskać taki efekt, że poniższy kod wywołany w oknie dialogowym w wątku - zmienia mi tylko tytuł okna dialogowego, a nie rusza ukrytego okna przy podglądzie, kiedy przełaczamy się Alt+Tab. Czyli tak jakbyśmy pod VCL zmieniali Form1.Caption, nie ruszając Application.Title. Z góry dziekuję za wszelkie przykłady.

procedure SetText(AHwnd : HWND; Text : string);
begin
  if AHwnd > 0 then
  begin
    SendMessage(AHwnd, WM_SETTEXT, 0, integer(PChar(Text)));
  end;
end;

procedure ThreadProc(Param : Pointer) stdcall;
const
  Wait_MS = 2000;
var
  S : string;
  I, R : integer;
  AppTitleArr : array[0..5] of string;
begin
  R := Low(AppTitleArr) + 1;
  AppTitleArr[0] := App_Title;
  AppTitleArr[1] := '#1 Text';
  AppTitleArr[2] := '#2 Text';
  AppTitleArr[3] := '#3 Text';
  AppTitleArr[4] := '#4 Text';
  Sleep(Wait_MS);
  while True do
  begin
    S := AppTitleArr[R];
    for I := 1 to Length(S) do
    begin
      SetText(MainDialogHandle, PChar(Copy(S, 1, I)));
      Sleep(120);
    end;
    Sleep(Wait_MS);
    R := R + 1;
    if R > High(AppTitleArr) then
    begin
      R := Low((AppTitleArr));
    end;
  end;
end;