View Full Version : تغییر سایز پنجره ها
ehsan_faal
چهارشنبه 20 اسفند 1393, 19:12 عصر
سلام دوستان.میخواستم بدونم توی دلفی میشه برنامه ای نوشت که پنجره ای از هر نرم افزار رو که الا فعاله به اندازه صفحه نمایش رسوند یا حداقل جوری بشه که تمام گزینه های اون پنجره نمایش داده بشه.
مثلا من متناسب با رشته ام با نرم افزاری مثله آلتیوم کار میکنم که بعضی از پنجره هاش اونقدر بزرگن که یه قسمتی از پایین و یه قسمتی از بالاشون هم توی کادر جا نمیشن.یه نرم افزاری مثله windowSpace هست که میتونه پنجره هایی که این مشکل رو دارن رو با درگ کردن به یکی از کناره ها سایزشون رو تغییر بده.
اما این فقط در مورد پنجره هاییه که بشه درگشون کرد،اگه یه پنجره ای قسمتی از بالاش حذف شده باشه و دیگه نتونیم درگش کنیم این نرم افزار دیگه جواب نمیده.حالا واسه من که اصلا رشتم برنامه نویسی نیست ساده ترین راه هایی که بتونم یه برنامه بنویسم که مثلا با فلان کلید پنجره ها رو تغییر سایز بده چیه؟
من قبل یکمی سی و سی++ و جاوا کار کردم.در حد خیلی ابتدایی.الان میخوام بدونم روال کار چیه و در کل یه مقدار راهنمایی میخوام.
با تشکر
golbafan
چهارشنبه 20 اسفند 1393, 19:26 عصر
سلام این مورد یکم حرفه ای هست و باید تمرین زیادی بکنید
ولی کدش اینه:
var
HWnd : THandle;
begin
IF FINDWINDOW(NIL,'Untitled - Notepad')<>0 then
begin
HWnd := FindWindow(nil, 'Untitled - Notepad'); //گرفتن هندل برنامه
setforegroundwindow(hwnd);
SetWindowPos(hWnd,HWND_BOTTOM,10,10,500,500,SWP_SH OWWINDOW); //تغییر سایز و مکان
end;
end;
الان من مختصات پنجره نوت پد رو 10 در 10 در 500 در 500 کردم
ehsan_faal
چهارشنبه 20 اسفند 1393, 19:33 عصر
ممنون.الان با گرفتن هندل یه پنجره راهی هست که بشه اسمش رو هم بدست آورد.آخه همون طور که گفتم این پنجره ای که باز میشه رو من نه بالاشو میبینم نه پایینشو!
golbafan
چهارشنبه 20 اسفند 1393, 19:35 عصر
ممنون.الان با گرفتن هندل یه پنجره راهی هست که بشه اسمش رو هم بدست آورد.آخه همون طور که گفتم این پنره ای که باز میشه رو من بالاشو میبینم نه پایینشو!
سلام
تابع findwindow با اسم اون پنجره کار میکنه
یعنی باید نامش رو بدونید
یعنی برای گرفتن هندل پنجره لت این تابع باید اسمشو بدونید
ehsan_faal
چهارشنبه 20 اسفند 1393, 19:44 عصر
واقعا شرمنده بابت سوالای ابتداییم.
این findwindow رو همینجوری که استفاده میکنم زیرش یه خط قرمز میاد.
تو قسمت uses باید چی اضافه کنم.
اصلا کلی تر بپرسم: راهی نداره مثله ide های جاوا خودشون uses ها رو مدیریت کنن؟
یوسف زالی
چهارشنبه 20 اسفند 1393, 20:39 عصر
سلام.
در دلفی در صورت استفاده از کامپوننت یوز اتفاق می افته نه در صورت استفاده از نام تابع.
Windows و Messages رو یوز کنید.
ehsan_faal
پنج شنبه 21 اسفند 1393, 20:35 عصر
حالا امکانش هست چند تا سر نخ بهم بدید که چجوری باید caption پنجره ای که(حالا این پنجره برای هر نرم افزار باز دیگه ای میتونه باشه) با موس روش کلیک میشه رو بگیرم؟
فکر کنم اگه بدونم دنبال چی باید بگردم بتونم یه کارایی بکنم.
با تشکر
BORHAN TEC
پنج شنبه 21 اسفند 1393, 21:35 عصر
حالا امکانش هست چند تا سر نخ بهم بدید که چجوری باید caption پنجره ای که(حالا این پنجره برای هر نرم افزار باز دیگه ای میتونه باشه) با موس روش کلیک میشه رو بگیرم؟
از کد زیر استفاده کنید:
function ActiveCaption: string;var
Handle: THandle;
Len: LongInt;
Title: string;
begin
Result := '';
Handle := GetForegroundWindow;
if Handle <> 0 then
begin
Len := GetWindowTextLength(Handle) + 1;
SetLength(Title, Len);
GetWindowText(Handle, PChar(Title), Len);
ActiveCaption := TrimRight(Title);
end;
end;
{ - - - - - - - - - - - - - - - - - - - - -}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.Caption := ActiveCaption;
end;
ehsan_faal
پنج شنبه 24 اردیبهشت 1394, 22:19 عصر
من این کد رو نوتم با راهنمایی های اساتید این سایت .
مشکل اینه که وقتی روی یه پنجره ای کلیک میکنم اون پنجره باید تغییر سایز بده پس من کد مربوط به تغییر سایز رو توی رویداد غیر فعال شدن فرم اصلیم نوشتم،ولی جواب نمیده. منتظر راهنماییه مجدد هستم:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.DBCtrls;
type
TForm1 = class(TForm)
mmo1: TMemo;
tmr1: TTimer;
procedure tmr1Timer(Sender: TObject);
procedure FormDeactivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Hndl:THandle;
type
Output=record
Title:string;
OutputHandle:THandle;
end;
implementation
{$R *.dfm}
function ActiveCaption: Output;var
Handle: THandle;
Len: LongInt;
Title: string;
begin
Result.Title := '';
Handle:=GetForegroundWindow;
if Handle<>0 then
begin
Len:=GetWindowTextLengthW(Handle)+1;
SetLength(Title,Len);
GetWindowTextW(Handle,PWideChar(Title),Len);
Result.Title:=TrimRight(Title);
Result.OutputHandle:=Handle;
end;
end;
procedure TForm1.FormDeactivate(Sender: TObject);
begin
SetWindowPos(Hndl,HWND_TOP,0,0,Screen.Width div 2,Screen.Height,SWP_SHOWWINDOW);
end;
procedure TForm1.tmr1Timer(Sender: TObject);
begin
Hndl:=ActiveCaption.OutputHandle;
mmo1.Lines.Clear;
mmo1.Lines.Add('Current Window : ');
mmo1.Lines.Add(ActiveCaption.Title);
if Form1.Visible then
SetWindowPos(Self.Handle,HWND_TOPMOST,Form1.Left,F orm1.Top,Form1.Width,Form1.Height,SWP_NOSIZE);
end;
end.
131237
ehsan_faal
پنج شنبه 24 اردیبهشت 1394, 23:49 عصر
من یه تغییراتی تو کد دادم:
دو تا دکمه گذاشتم یکی واسه گرفتن هندل و یکی هم واسه تغییر سایز که البته اینا هیچ وقت تویه زمان با هم نمیتونن فعال باشن.
الان درست کار میکنه ولی تا اینجایی که من تست کردم فقط پنجره فایل اکسپلورر رو تغییر سایز میده ولی مثلا پنجره تسک منیجر اندازش تغییر نمیکنه.
باید از چیزهای دیگه ای استفاده کنم؟
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.DBCtrls,
sSkinManager;
type
TForm1 = class(TForm)
tmr1: TTimer;
btn1: TButton;
btn2: TButton;
tmr2: TTimer;
sknmngr1: TsSkinManager;
procedure tmr1Timer(Sender: TObject);
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure tmr2Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Hndl: THandle;
type
Output = record
Title: string;
OutputHandle: THandle;
end;
implementation
{$R *.dfm}
function ActiveCaption: Output;
var
Handle: THandle;
Len: LongInt;
Title: string;
begin
Result.Title := '';
Handle := GetForegroundWindow;
if Handle <> 0 then
begin
Len := GetWindowTextLengthW(Handle) + 1;
SetLength(Title, Len);
GetWindowTextW(Handle, PWideChar(Title), Len);
Result.Title := TrimRight(Title);
Result.OutputHandle := Handle;
end;
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
btn2.Enabled := False;
Hndl := ActiveCaption.OutputHandle;
if Hndl = Self.Handle then
tmr1.Enabled := True;
end;
procedure TForm1.btn2Click(Sender: TObject);
var
xSource: Integer;
begin
xSource := (Screen.Width div 2) div 2;
SetWindowPos(Hndl, HWND_TOP, xSource, 0, Screen.Width div 2, Screen.Height,
SWP_SHOWWINDOW);
btn1.Enabled := True;
btn2.Enabled:=False;
end;
procedure TForm1.tmr1Timer(Sender: TObject);
begin
Hndl := ActiveCaption.OutputHandle;
if Hndl = Self.Handle then
begin
Hndl := ActiveCaption.OutputHandle;
end
else
begin
btn2.Enabled := True;
btn1.Enabled := False;
tmr1.Enabled := False;
end;
end;
procedure TForm1.tmr2Timer(Sender: TObject);
begin
if Form1.Visible then
SetWindowPos(Self.Handle, HWND_TOPMOST, Form1.Left, Form1.Top, Form1.Width,
Form1.Height, SWP_NOSIZE);
end;
end.
ehsan_faal
پنج شنبه 24 اردیبهشت 1394, 23:56 عصر
مشکل حل شد.داکیومنت تابع setWindowPos رو از MSDN خوندم:تشویق:
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.