PDA

View Full Version : حرفه ای: رزرو قسمتی از دسکتاپ برای فرم به گونه ای که برنامه های دیگه اجازه اسنفاده از اون قسمت رو نداشته باشن



imanx7
دوشنبه 18 خرداد 1394, 13:17 عصر
سلام
اولا از موضوع تاپیکم به دلیل گنگ بودن عذر خواهی میکنم ؛
راستیش خیلی وقته دنبال این خاصیت از فرم هستم اما چون نمیدونستم سوالم رو چجوری بپرسم، سوالم رو مطرح نکردم ،
ممکنه یه ذره مطرح کردنش گُنگ باشه که بازم عذر میخوام

شما taskbar ویندوز رو در نظر بگیرید ، وقتی هر فرم یا پنجره ای که باز میکنید ؛ میاد بالای اون taskbar قرار میگیره نه روی اون !
چجوری میتونم همچین خاصیتی رو به فرمم بدم تا پنجره های دیگه روی اون قرار نگیرن بلکه بالا و پایین اون !؟
ممنون میشم از راهنماییاتون

mthreat.info
دوشنبه 18 خرداد 1394, 14:22 عصر
this.TopMost = true; با این کد فرم شما همیشه روی بقیه قرار میگیره

imanx7
دوشنبه 18 خرداد 1394, 14:25 عصر
this.TopMost = true; با این کد فرم شما همیشه روی بقیه قرار میگیره
نه جناب مثل اینکه متوجه منظور من نشدید نمیخوام روی همه پنجره باشه !
شما یه نیگاه به taskbar ویندوز بکنید، متوجه منظورم میشین !

ebrahim.rayatparvar
دوشنبه 18 خرداد 1394, 15:57 عصر
این سوال برای من هم گنگه میشه با یه عکس منظورت رو برسونی؟؟؟

winner1
دوشنبه 18 خرداد 1394, 16:05 عصر
ینی هر پنجره ای مربوز به هر برنامه ای یا فقط پنجره های مربوط به برنامه ی شما؟

Javad_raouf
دوشنبه 18 خرداد 1394, 16:54 عصر
فکر کنم منظورشون رو فهمیدم
اگر درست متوجه شده باشم یک همچین چیزی می خوان:
132066
تو این تصویر نرم افزار JetAudio همین حالت رو پیدا کرده یعنی رفته بالای TaskBar قرار گرفته و مرورگر کروم با اینکه به حالت Maximize هست ولی نتونسته روی JetAudio رو بگیره
درست حدس زدم؟؟؟؟؟

Javad_raouf
دوشنبه 18 خرداد 1394, 17:32 عصر
یافتم دوستان:لبخندساده:
البته اگر سوال رو درست متوجه شده باشم
این چیزی که شما می خوای اصطلاحا بهش میگن AppBar
جواب اینه:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;


using System.Runtime.InteropServices;


namespace Test305
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
//this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
//this.ClientSize = new System.Drawing.Size(960, 50);
}
const ABEdge DockMode = ABEdge.ABE_BOTTOM;
#region APPBAR


[StructLayout(LayoutKind.Sequential)]
struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}


[StructLayout(LayoutKind.Sequential)]
struct APPBARDATA
{
public int cbSize;
public IntPtr hWnd;
public int uCallbackMessage;
public int uEdge;
public RECT rc;
public IntPtr lParam;
}


enum ABMsg : int
{
ABM_NEW = 0,
ABM_REMOVE = 1,
ABM_QUERYPOS = 2,
ABM_SETPOS = 3,
ABM_GETSTATE = 4,
ABM_GETTASKBARPOS = 5,
ABM_ACTIVATE = 6,
ABM_GETAUTOHIDEBAR = 7,
ABM_SETAUTOHIDEBAR = 8,
ABM_WINDOWPOSCHANGED = 9,
ABM_SETSTATE = 10
}


enum ABNotify : int
{
ABN_STATECHANGE = 0,
ABN_POSCHANGED,
ABN_FULLSCREENAPP,
ABN_WINDOWARRANGE
}


enum ABEdge : int
{
ABE_LEFT = 0,
ABE_TOP,
ABE_RIGHT,
ABE_BOTTOM
}


private bool fBarRegistered = false;


[DllImport("SHELL32", CallingConvention = CallingConvention.StdCall)]
static extern uint SHAppBarMessage(int dwMessage, ref APPBARDATA pData);
[DllImport("USER32")]
static extern int GetSystemMetrics(int Index);
[DllImport("User32.dll", ExactSpelling = true,
CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private static extern bool MoveWindow
(IntPtr hWnd, int x, int y, int cx, int cy, bool repaint);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
private static extern int RegisterWindowMessage(string msg);
private int uCallBack;


private void RegisterBar()
{
APPBARDATA abd = new APPBARDATA();
abd.cbSize = Marshal.SizeOf(abd);
abd.hWnd = this.Handle;
if (!fBarRegistered)
{
uCallBack = RegisterWindowMessage("AppBarMessage");
abd.uCallbackMessage = uCallBack;


uint ret = SHAppBarMessage((int)ABMsg.ABM_NEW, ref abd);
fBarRegistered = true;


ABSetPos();
}
else
{
SHAppBarMessage((int)ABMsg.ABM_REMOVE, ref abd);
fBarRegistered = false;
}
}


private void ABSetPos()
{
APPBARDATA abd = new APPBARDATA();
abd.cbSize = Marshal.SizeOf(abd);
abd.hWnd = this.Handle;
abd.uEdge = (int)DockMode;


if (abd.uEdge == (int)ABEdge.ABE_LEFT || abd.uEdge == (int)ABEdge.ABE_RIGHT)
{
abd.rc.top = 0;
abd.rc.bottom = SystemInformation.PrimaryMonitorSize.Height;
if (abd.uEdge == (int)ABEdge.ABE_LEFT)
{
abd.rc.left = 0;
abd.rc.right = Size.Width;
}
else
{
abd.rc.right = SystemInformation.PrimaryMonitorSize.Width;
abd.rc.left = abd.rc.right - Size.Width;
}


}
else
{
abd.rc.left = 0;
abd.rc.right = SystemInformation.PrimaryMonitorSize.Width;
if (abd.uEdge == (int)ABEdge.ABE_TOP)
{
abd.rc.top = 0;
abd.rc.bottom = Size.Height;
}
else
{
abd.rc.bottom = SystemInformation.PrimaryMonitorSize.Height;
abd.rc.top = abd.rc.bottom - Size.Height;
}
}


// Query the system for an approved size and position.
SHAppBarMessage((int)ABMsg.ABM_QUERYPOS, ref abd);


// Adjust the rectangle, depending on the edge to which the
// appbar is anchored.
switch (abd.uEdge)
{
case (int)ABEdge.ABE_LEFT:
abd.rc.right = abd.rc.left + Size.Width;
break;
case (int)ABEdge.ABE_RIGHT:
abd.rc.left = abd.rc.right - Size.Width;
break;
case (int)ABEdge.ABE_TOP:
abd.rc.bottom = abd.rc.top + Size.Height;
break;
case (int)ABEdge.ABE_BOTTOM:
abd.rc.top = abd.rc.bottom - Size.Height;
break;
}


// Pass the final bounding rectangle to the system.
SHAppBarMessage((int)ABMsg.ABM_SETPOS, ref abd);


// Move and size the appbar so that it conforms to the
// bounding rectangle passed to the system.
MoveWindow(abd.hWnd, abd.rc.left, abd.rc.top,
abd.rc.right - abd.rc.left, abd.rc.bottom - abd.rc.top, true);
}


protected override void WndProc(ref System.Windows.Forms.Message m)
{
if (m.Msg == uCallBack)
{
switch (m.WParam.ToInt32())
{
case (int)ABNotify.ABN_POSCHANGED:
ABSetPos();
break;
}
}


base.WndProc(ref m);
}


protected override System.Windows.Forms.CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.Style &= (~0x00C00000); // WS_CAPTION
cp.Style &= (~0x00800000); // WS_BORDER
cp.ExStyle = 0x00000080 | 0x00000008; // WS_EX_TOOLWINDOW | WS_EX_TOPMOST
return cp;
}
}


#endregion


private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
RegisterBar();
}


private void Form2_Load(object sender, EventArgs e)
{
RegisterBar();
}


}
}



فقط دو خط:
//this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
//this.ClientSize = new System.Drawing.Size(960, 50);
رو کامنت کردم تا اندازه و استایل فرم رو دستی تنظیم کنید

asman.abi
دوشنبه 18 خرداد 1394, 18:43 عصر
از کجا کپی کردی این همه کد! :متعجب:
ساده تر نمی تونستی انجام بدی.

sabz12
دوشنبه 18 خرداد 1394, 19:01 عصر
شاید هم منظورشون این باشه که وقتی برنامه خودشون را اجرا میکنند روی تکسبار را می پوشونه.

Javad_raouf
دوشنبه 18 خرداد 1394, 19:29 عصر
از کجا کپی کردی این همه کد! :متعجب:

ساده تر نمی تونستی انجام بدی.
از توی یک سایت کپی کردم توی برنامه خودم تست کردم جواب گرفتم
تازه تیکه های اضافیشو حذف کردم یه کوچولو هم کد بهش اضافه کردم:کف:
گذاشتم اینجا:لبخند:
ساده تر از این نمیشه چون اینا هر کدومش یک قضیه ای داره
علاوه بر تنظیمات فرم و برنامه باید به ویندوز هم فرمان بدی که بفهمه اون تیکه پایین یا بالا یا چپ یا راست رزرو شده و برنامه دیگری حق داره اینجا رو بگیر
تابع RegisterBar کارش دقیقا همینه و با استفاده از API های Import شده این کار رو انجام میده
تابع ABSetPos مکان و سایز فرم AppBar رو مشخص می کنه
بقیه هم که تعاریف Enum و ... هست
پس همش لازمه:لبخندساده:

راستی دوستان این تیکه کد رو هم خودم اضافه کردم:
const ABEdge DockMode = ABEdge.ABE_BOTTOM;
چیز مهمی نیست فقط می تونین با این مشخص کنید Appbar بالا، پایین، چپ یا راست باشه

اینم لینک جایی که کد رو ازش کپی کردم:
http://www.codeproject.com/Articles/6741/AppBar-using-C
توضیحات کاملی هم نوشته

Javad_raouf
دوشنبه 18 خرداد 1394, 19:37 عصر
شاید هم منظورشون این باشه که وقتی برنامه خودشون را اجرا میکنند روی تکسبار را می پوشونه.
اینجوری ثابت می کنم که من درست می گم:


شما taskbar ویندوز رو در نظر بگیرید ، وقتی هر فرم یا پنجره ای که باز میکنید ؛ میاد بالای اون taskbar قرار میگیره نه روی اون !
این جمله یکم نیاز به تفسیر داره:کف:
در این جمله کلمه "بالای" با کلمه "روی " دو تا معنی متفاوت دارد:لبخند:
"بالای" به محور Y ها و "روی" به محور Z ها اشاره دارد:چشمک:

reza_ali202000
دوشنبه 18 خرداد 1394, 20:10 عصر
دوست عزیز فک کنم منظورتون اینجوری باشه.
حتی taskbar هم میره زیر این فرم!

imanx7
دوشنبه 18 خرداد 1394, 23:09 عصر
فکر کنم منظورشون رو فهمیدم
اگر درست متوجه شده باشم یک همچین چیزی می خوان:
132066
تو این تصویر نرم افزار JetAudio همین حالت رو پیدا کرده یعنی رفته بالای TaskBar قرار گرفته و مرورگر کروم با اینکه به حالت Maximize هست ولی نتونسته روی JetAudio رو بگیره
درست حدس زدم؟؟؟؟؟
درسته جناب رئوف منظورم همین بود ! خیلی ممنون از راهنمایی شما و تمامی دوستان

imanx7
دوشنبه 18 خرداد 1394, 23:37 عصر
شرمنده این کد الان فرم رو میبره پایین قرار میده اگه بخوام ببره بالای سکرین کجاش رو باید تغییر بدم ؟!:لبخند:

reza_ali202000
دوشنبه 18 خرداد 1394, 23:54 عصر
شرمنده این کد الان فرم رو میبره پایین قرار میده اگه بخوام ببره بالای سکرین کجاش رو باید تغییر بدم ؟!:لبخند:
فکر میکنم الان دیگه همونی هس که میخاین.

Javad_raouf
سه شنبه 19 خرداد 1394, 09:07 صبح
شرمنده این کد الان فرم رو میبره پایین قرار میده اگه بخوام ببره بالای سکرین کجاش رو باید تغییر بدم ؟!:لبخند:
دشمنت شرمنده بالاتر عرض کردم:
متغیر DockMode رو باید عوض کنید
به جای:
const ABEdge DockMode = ABEdge.ABE_BOTTOM;
باید بنویسید:
const ABEdge DockMode = ABEdge.ABE_TOP;
اینجوری میره بالای مانیتورت :لبخند:
اینجوری هم می تونی بنویسی:
const ABEdge DockMode = ABEdge.ABE_LEFT;
تا بره سمت چپ صفحه دسکتاپ رو بگیره
یا:
const ABEdge DockMode = ABEdge.ABE_RIGHT;
برای سمت راست

imanx7
سه شنبه 19 خرداد 1394, 10:34 صبح
دشمنت شرمنده بالاتر عرض کردم:
متغیر DockMode رو باید عوض کنید
به جای:
const ABEdge DockMode = ABEdge.ABE_BOTTOM;
باید بنویسید:
const ABEdge DockMode = ABEdge.ABE_TOP;
اینجوری میره بالای مانیتورت :لبخند:
اینجوری هم می تونی بنویسی:
const ABEdge DockMode = ABEdge.ABE_LEFT;
تا بره سمت چپ صفحه دسکتاپ رو بگیره
یا:
const ABEdge DockMode = ABEdge.ABE_RIGHT;
برای سمت راست

ممنون از شما جناب رئوف؛ ولی مشکلش اینه که دقیقا به بالای صفحه Anchor نمیشه !!!
132080

imanx7
سه شنبه 19 خرداد 1394, 10:41 صبح
خیلی ممنون از همه بخصوص آقای رئوغ ؛ خودم مشکلش رو حل کردم ! بازم ممنون

black_King
دوشنبه 30 بهمن 1396, 22:54 عصر
خیلی ممنون از همه بخصوص آقای رئوغ ؛ خودم مشکلش رو حل کردم ! بازم ممنون

با سلام میشه بگی چطور مشکل را حل کردی؟ من دقیقا همین مشکل را دارم.