PDA

View Full Version : مختصات task bar



Modernidea
جمعه 06 دی 1387, 14:20 عصر
سلام

با چه كد يا تابعي ميشه مختصات task bar را بدست آورد؟

با تشكر

Modernidea
شنبه 07 دی 1387, 23:31 عصر
اساتيد عزيز، جناب آقاي كشاورز اينجا به كمك شما نياز است.

arash_ebrahimi_nk
شنبه 07 دی 1387, 23:57 عصر
c1
windows.FindWindow('Shell_TrayWnd', '');

c2
FindWindowEx(c1, 0, 'ReBarWindow32', '');


FindWindowEx(c2, 0, 'MSTaskSwWClass', '')

hojjatcroos
دوشنبه 09 دی 1387, 07:22 صبح
سلام برای به دست آوردن مختصات TaskBar می تونی از دستور زیر هم استفاده کنی.دو دکمه به فرم اضافه کن و به uses هم shellapi رو اضافه کن.
type
TTaskBarPos = (_TOP, _BOTTOM, _LEFT, _RIGHT, _NONE);
function GetTaskBarPos: TTaskBarPos;
var
hTaskbar: HWND;
T: TRect;
scrW, scrH: integer;
begin
hTaskBar := FindWindow('Shell_TrayWnd', nil);
if hTaskbar <> 0 then
begin
GetWindowRect(hTaskBar, T);
ScrW := Screen.Width;
ScrH := Screen.Height;
if (T.Top > scrH div 2) and (T.Right >= scrW) then
Result := _BOTTOM
else if (T.Top < scrH div 2) and (T.Bottom <= scrW div 2) then
Result := _TOP
else if (T.Left < scrW div 2) and (T.Top <= 0) then
Result := _LEFT
else // the last "if" is not really needed
if T.Left >= ScrW div 2 then
Result := _RIGHT;
end;
end;

حالا کد زیر را برای دکمه شماره یک قرار بده
procedure TForm1.Button1Click(Sender: TObject);
var
tabd: TAppBarData;
PosString: string;
begin
FillChar(tabd, SizeOf(TAppBarData), 0);
tabd.cbSize := SizeOf(TAppBarData);
if SHAppBarMessage(ABM_GETTASKBARPOS, Tabd) = 0 then Exit;
with Tabd.rc do
PosString := Format(' (%d, %d);(%d, %d) ', [Left, Top, Right, Bottom]);
case tabd.uEdge of
ABE_LEFT: ShowMessage('Left Position' + PosString);
ABE_TOP: ShowMessage('Top Position' + PosString);
ABE_RIGHT: ShowMessage('Right Position' + PosString);
ABE_BOTTOM: ShowMessage('Bottom Position' + PosString);
end;
end;

دکمه شماره 2

procedure TForm1.Button2Click(Sender: TObject);
var
TaskBarPos: TTaskBarPos;
begin
TaskBarPos := GetTaskBarPos;
case TaskBarPos of
_LEFT: ShowMessage('Left Position');
_TOP: ShowMessage('Top Position');
_RIGHT: ShowMessage('Right Position');
_BOTTOM: ShowMessage('Bottom Position');
end;
end;

arash_ebrahimi_nk
دوشنبه 09 دی 1387, 09:09 صبح
hojjatcroos :
ممنون که کد کامل رو قرار دادید اما کمی عجیب به نظر میرسن؟! انقدر مقادیر و متغیّرهای اضافی واقعا نیاز هستن؟ و یا حتی ShellApi؟ بعد از بدست آوردن Handle تسکبار نمیشه از راه های ساده تر مثل همون GetWindowRect به نتیجه رسید؟

Modernidea
دوشنبه 09 دی 1387, 20:52 عصر
c1
windows.FindWindow('Shell_TrayWnd', '');

c2
FindWindowEx(c1, 0, 'ReBarWindow32', '');


FindWindowEx(c2, 0, 'MSTaskSwWClass', '')


آقا آرش با تشكر، ولي داداش ما هنوز اول راهيم اگه ميشه بگيد كه c1 و c2 چه متغير هايي هستند و اين تابع ها چي بر مي گردونن؟ آقا كلا با اين كدا چيكار كنم
از دوست ديگمونم ممنونم.

Modernidea
سه شنبه 10 دی 1387, 23:10 عصر
سلام
اساتيد محترم با عذرخواهي از شما خواهش مي كنم به سوال قبلي من پاسخ دهيد

باتشكر

hojjatcroos
چهارشنبه 11 دی 1387, 07:32 صبح
سلام اولا شما مختصات Taskbar رو برای چه چیز می خواهید این خیلی مهم است.دوم کدی که برای شما قرار دادم کاملا درست است و مختصات عددی رو همه به شما می دهد.اگر می خواهید در Taskbar چیزی مثل یک دکمه قرار دهید بگویید تا شما را کمک کنم.

Modernidea
پنج شنبه 12 دی 1387, 23:43 عصر
سلام اولا شما مختصات Taskbar رو برای چه چیز می خواهید این خیلی مهم است.دوم کدی که برای شما قرار دادم کاملا درست است و مختصات عددی رو همه به شما می دهد.اگر می خواهید در Taskbar چیزی مثل یک دکمه قرار دهید بگویید تا شما را کمک کنم.



سلام و با تشكر از توجه شما
برنامه من به اين شكل كه زماني كه اجرا ميشه از پايين تسك بار به تاپ فرم اضافه ميشه تا پايين فرم با بالاي تسك بار مماس بشه. البته در برنامه شما با مختصاتي كه ميدهد ميشه اين كار رو كرد ولي همونطور كه گفتم نميدوم خروجي تابع چه متغيري است و اون اعدادي كه در ليبل چاپ ميشه از چه متغيري ميگيريد.
كفتم كه هيچي بلد نييستم!:خجالت:

Modernidea
جمعه 13 دی 1387, 08:09 صبح
سلام اولا شما مختصات Taskbar رو برای چه چیز می خواهید این خیلی مهم است.دوم کدی که برای شما قرار دادم کاملا درست است و مختصات عددی رو همه به شما می دهد.اگر می خواهید در Taskbar چیزی مثل یک دکمه قرار دهید بگویید تا شما را کمک کنم.


hojjatcroos:
حاجي دستت درست. رفتم خودمو كشتم يكم فهميدم چيكار كنم من به اين شكل از اين كد استفاده كردم ببينيد درسته يا نه:



var
tabd: TAppBarData;
begin
FillChar(tabd, SizeOf(TAppBarData), 0);
tabd.cbSize := SizeOf(TAppBarData);
if SHAppBarMessage(ABM_GETTASKBARPOS, Tabd) = 0 then Exit;
with Tabd.rc do
topfrm:= tabd.rc.Top-Form2.Height

البته در يك تايمر نوشتم از زير تسكبار شروع كنه به اضافه كردن به تاپ فرم تا اينكه به عدد به دست اومده از كد بالا برسه.

تشكر فراوان

arash_ebrahimi_nk
جمعه 13 دی 1387, 14:34 عصر
با استفاده از توابع API


var rcTemp1 : TRect;
rcTemp2 : TRect;
I : Integer;
begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @rcTemp1, 0);
{ShowWindow(Form2.Handle, SW_HIDE) //Form2>Invisible}
Windows.GetWindowRect(Form2.Handle, rcTemp2);

rcTemp2.Left := rcTemp2.Left + (rcTemp1.Right - rcTemp2.Right);
// rcTemp2.Top := rcTemp2.Top + (rcTemp1.Bottom - rcTemp2.Bottom)
rcTemp2.Top := rcTemp2.Top + (rcTemp1.Bottom - rcTemp2.Top);

SetWindowPos(Form2.Handle, 0, rcTemp2.Left, rcTemp2.Top, 0, 0, SWP_NOZORDER or SWP_NOSIZE);

ShowWindow(Form2.Handle, SW_SHOW); //VCL -> Form2.Show;
GetWindowRect(Form2.Handle, rcTemp1);

for I := 1 to (rcTemp1.Bottom - rcTemp1.Top) do begin
Sleep(5);
SetWindowPos(Form2.Handle, 0, rcTemp2.Left, rcTemp2.Top-I, 0, 0, SWP_NOZORDER or SWP_NOSIZE);
end;
end;

Modernidea
چهارشنبه 18 دی 1387, 11:48 صبح
با استفاده از توابع API


var rcTemp1 : TRect;
rcTemp2 : TRect;
I : Integer;
begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @rcTemp1, 0);
{ShowWindow(Form2.Handle, SW_HIDE) //Form2>Invisible}
..... Windows.GetWindowRect(Form2.Handle, rcTemp2);



سلام
خيلي ممنون. ولي يك سوال دارم كه شما از كجا به اين كدها دستيابي پيدا كردين يا چطوري اينارو ياد گرفتين؟ كلا من از كجا ياد بگيرم؟
كجاي msdn اينارو نوشته؟
درضمن يكي دوتا مشكل است: يكي اينكه تاقتي كه فرم ثابت نشده اجزاي روي فرم بجز اديت باكس هيچكودوم ديده نميشن
دوم اينكه سرعت خواب كوتاه حلقه for كم است و با تغيير آن به صفر هم زياد فرقي نمي كنه.

arash_ebrahimi_nk
چهارشنبه 18 دی 1387, 12:02 عصر
اولین خط رو حفظ نبودم واسه همین از Help دلفی استفاده کردم و از قسمت search کلمه taskbar رو سرچ کردم که البته کد اول چندان ربطی به taskbar نداره اما برای کدی که مدنظر داشتید بهترین کد به نظر میرسه (من هم واسه برنامه خودم که میخواستم یه پنجره به سمت راست محیط کاری بچسبه ازش استفاده کردم).
ولی بقیه چیزها زیاد مشکل نیست؛ استفاده از rect و توابع مرتبط به اون مثل getwindowrect یا getclientrect که با استفاده از اونها و همون کدی که اول گفتم خودتون میتونستید مختصات taskbar رو بدست بیارن هم تو help دلفی هست.
من منابع برنامه نویسی برای ویندوز رو روی نت نمیدونم کجاست یه سری منابع از اینور و اونور توی کامپیوترم جمع کردم و به اضافه تحقیق از طریق گوگل و Help دلفی؛ کدهای api مناسب با کارم رو تو کد نویسی استفاده مینکم.