Wielkie dzięki kAzek. Działa świetnie, chociaż chciałbym poprawić jeszcze jedną rzecz. Otóż mój generator pokazuje na belce
tytułowej po wyświetleniu najpierw tytulu programu losowe teksty. Robi to w wątku (kod poniżej). Jednak ja chcialbym mieć
taki efekt, że to co jest Application.Title normalnie pozostaje niezmienne. Tytuł dla IDC_TAPPFORM ustawiłem przez Caption
w pliku rc. jednak mój kod powoduje, że jak miną dwie sekundy po pokazaniu tytułu aplikacji, a ja przełączam się pomiędzy
oknami za pomocą Alt+Tab to tytuł aplikacji jest taki jak kawałek wypisanego w wątku losowego tekstu, a ja chciałbym mieć
zawsze taki sam tytuł. Czyli tak jak jest to analogicznie w VCL, że Application.Title sobie ustawiamy jakie chcemy, a zmienia
się tylko Caption formatki. U mnie AppHandle to uchwyt pobrany przy tworzeniu ukrytego okna bez belki, a DialogHandle to
uchwyt Dialogu który się wyświetla później. Poniżej wycinki kodu źródłowego. Bo w googlach natrafiłem wcześniej na jakimś
forum na kod, ktory wywoływał jakoś okno dialogowe z zasobów tak jakby robione to było przez Form.ShowModal, ale teraz
nie pamiętam co wpisałem dokładnie w googlach, coś z obejściem problemu z WM_CHAR szukałem. Jakbym jeszcze tylko to
jakoś okiełznał z Twoją pomocą to miałbym idealny program. Chociaż mam generator kluczy do jednego populanego klienta
ircowego pisany dawno temu w masmie i tam litery na pasku tytułowym są co kilkaset milisekund zmieniane - z wielkiej na
małą i odwrotnie. Jednak może da się osiągnąć to co chcę zrobić. Bo o ile wiem jak sprawdzałem w VCL'u, to się da zrobić.
Jeżeli w WinApi jest to problem, to trudno - podaruję sobie. Jednak fajnie było by to jakoś dopracować. I dodam również iż
z moich testów wynika, że nie ważne czy wątek uruchomiłem z ukrytego czy widocznego dialogu tuż po ustawieniu AppTitle.
W sumie to kosmetyka i aż tak bardzo mi nie przeszkadza, bo program ma swoją ikonę, ale fajnie było by to dopracować.
Procedura obsługi wątku:
procedure ThreadProc;
var
S : string;
R, LastR, I : integer;
AppTitleArr : array[0..3] of string;
begin
LastR := -1;
AppTitleArr[0] := AppTitle;
AppTitleArr[1] := 'Coded by olesio';
AppTitleArr[2] := 'Made in pure WinApi';
AppTitleArr[3] := 'Thanks to kAzek for help';
while True do
begin
if LastR = -1 then
begin
R := 0;
LastR := 0;
end
else
begin
repeat
R := Random(Length(AppTitleArr));
until R <> LastR;
LastR := R;
end;
S := AppTitleArr[R];
for I := 1 to Length(S) do
begin
SetWindowText(AppHandle, PChar(AppTitle));
SetWindowText(DialogHandle, PChar(Copy(S, 1, I)));
Sleep(120);
end;
Sleep(2000);
end;
end;
Funkcja obsługi komunikatów w widocznym oknie:
function MainDlgProc(hWnd : HWND; Msg : UINT; wParam : wParam; lParam : lParam) : BOOL; stdcall;
var
Buffer : array[0..128] of Char;
begin
DialogHandle := hWnd;
// ... tutaj obsluga przychodzących Msg
end;
Tworzenie ukrytego okna i w nim stworzenie wątku oraz tworzenie głownego widocznego okna:
function HidenDlgProc(hWnd: HWND; uMsg, wParam, lParam: Longint): Bool; stdcall;
var
ThrID : Cardinal;
Buffer : array[0..128] of Char;
begin
Result := False;
case uMsg of
WM_CLOSE :
begin
EndDialog(hWnd, 0);
end;
WM_INITDIALOG:
begin
Randomize;
ThrID := 58;
AppHandle := hWnd;
hMainIcon:= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAINICON)) ;
SendMessage(AppHandle, WM_SETICON, 1, hMainIcon);
ShowWindow(AppHandle, SW_HIDE);
GetWindowText(AppHandle, Buffer, SizeOf(Buffer));
AppTitle := Buffer;
CreateThread(nil, 0, @ThreadProc, nil, 0, ThrID);
DialogBoxParamA(hInstance, MAKEINTRESOURCE(IDC_TMAINFORM), hWnd,
@MainDlgProc, 0);
Result:= True;
end;
end;
end;
var
Res : Integer;
begin
hInstance := GetModuleHandle(nil);
Res := DialogBoxParamA(hInstance, MAKEINTRESOURCE(IDC_TAPPFORM),
0, @HidenDlgProc, 0);
ExitProcess(Res);
end.