Вот основные функции которые тебе по надобятся:| Код | function GetTitleBar_Width(Pr_HWND:HWND):integer; type TGTBInfo=function (hwnd: HWND; var pti: TTitleBarInfo): BOOL; stdcall; var H:Cardinal; GTBInfo:TGTBInfo; R:TRect; TBI:tagTITLEBARINFO; i,j:integer; begin Result:=0; H:=LoadLibrary('User32.dll'); if H<>0 then begin GTBInfo:=GetProcAddress(H,'GetTitleBarInfo'); if Assigned(GTBInfo) then begin TBI.cbSize:=SizeOf(TBI); GTBInfo(PR_HWND,TBI); Result:=TBI.rcTitleBar.Right-TBI.rcTitleBar.Left; i:=Length(TBI.rgstate); if i>0 then begin R:=Rect(0,0,0,0); GetClientRect(Pr_HWND,R); j:=R.Right-R.Left-Result; if j>1 then repeat dec(i); if (TBI.rgstate[i] and STATE_SYSTEM_INVISIBLE)<>STATE_SYSTEM_INVISIBLE then Result:=Result-j; until (i=1); end; end; FreeLibrary(H); end; if Result<=0 then begin R:=Rect(0,0,0,0); GetClientRect(Pr_HWND,R); Result:=R.Right-R.Left; end; end;
function GetWin_Text(Pr_HWND:HWND):string; var s:string; i,j:integer; begin i:=GetWindowTextLength(Pr_HWND); repeat i:=i+10; SetLength(s,i+1); j:=GetWindowText(Pr_HWND,PChar(s),i+1); until (j<>i); Result:=Copy(s,1,j); end;
procedure SetWin_Text(Pr_HWND:HWND; var s:string); begin SetWindowText(Pr_HWND,PChar(s)); end;
function GetStr_Width(Pr_HWND:HWND; const s:string):integer; var HWND_DC:HDC; hFontNew,hFontOld:HFONT; TM:TTextMetric; Size:TSize; begin Result:=0; HWND_DC:=GetDC(Pr_HWND); if HWND_DC<>0 then begin hFontNew:=SendMessage(Pr_HWND,WM_GETFONT,0,0); hFontOld:=SelectObject(HWND_DC,hFontNew); GetTextMetrics(HWND_DC,TM); GetTextExtentPoint32(HWND_DC,PChar(s),Length(s),Size); Result:=Size.cx+TM.tmAveCharWidth; SelectObject(HWND_DC,hFontOld); ReleaseDC(Pr_HWND,HWND_DC); end; end; |
А вот так можно их использовать для прокрутки заголовка:| Код | procedure TForm1.Button1Click(Sender: TObject); var s,T_SC:string; SC:Char; pHWND:HWND; i,W,WS:integer; begin pHWND:=Handle; //Сюда подставляеш дескриптор чужого окна s:=trim(GetWin_Text(pHWND)); if s='' then exit; W:=GetTitleBar_Width(pHWND); if W=0 then exit; if Length(s)=1 then i:=GetStr_Width(pHWND,s) else i:=GetStr_Width(pHWND,s[1]+s[Length(s)]); if i=0 then exit; SC:=' '; WS:=GetStr_Width(pHWND,SC); if WS=0 then begin SC:='.'; WS:=GetStr_Width(pHWND,SC); if WS=0 then exit; end; i:=W-i; T_SC:=SC; while i>WS do begin T_SC:=T_SC+SC; WS:=GetStr_Width(pHWND,T_SC); end; s:=s+T_SC; //Модифицированный заголовок окна, для прокрутки i:=0; repeat SetWin_Text(pHWND,s); inc(i); Sleep(50); Application.ProcessMessages; s:=copy(s,2,Length(s))+s[1]; until (i=1000); end; |
PS: Также можно енто реализовать путем перебрасывания пикселей в заголовке.
Удачи. |