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;