PDA

View Full Version : سوال: برنامه ای که در بالای دسکتاب باز شده و ثابت بماند



iradata
جمعه 25 تیر 1389, 19:39 عصر
سلام

می خواستم برنامه ای بنویسم که در بالای دسکتاپ باز شده و به طور ثابت on top در بالای دسکتاپ بماند و کلا آن فضا را اشغال کند به طوری که در صورتی که برنامه های دیگر باز شده و به حالت maximize در آمدند زیر برنامه من باشند لطفا در این زمینه من روو راهنمایی کنید

امیدوارم که منظورم روو خوب رسانده باشد در ضمن دو عدد تصویر از برنامه مورد نظر خودم روو ضمیمه کردم در صورتی که مطلب روو متوجه نشده اید به این تصاویر را نگاه کنید

ricky22
جمعه 25 تیر 1389, 19:58 عصر
'Put this in form_load
Me.TopMost = True

nasim bahari
یک شنبه 24 مرداد 1389, 21:49 عصر
'Put this in form_load
Me.TopMost = True



سلام دوست عزیزم.........

این کد فقط Top Most رو انجام میده. یعنی این فرم بروی پنجره های باز شده دیگه قرار می گیره.........

اما منظور دوستمون این بود که علاوه بر Top Most بودن ، دیگر پنجره ها که باز می شوند( در حالت حداکثر و یا در صورت جابجای دستی فرم ) در پایین برنامه قرار بگیرند....یعنی بالای پنجره مورد نظر در پشت فرم برنامه ما قرار نگیرد.....

کمک فوری........

دوستان راهنمایی کنید.........

nasim bahari
یک شنبه 24 مرداد 1389, 22:09 عصر
دوستان کل تالار رو زیر و رو کردم.............

یکی از دوستان ....... فکر می کنم به نتیجه رسیده...... که آدرسشو رو می زارم........اگه دوستان می تونن یه نمونه برنامه برام بزارن.......ممنون میشم......

کمک فوری......

( لطفاً به عکس هایی که دوست ایجاد کننده تایپیک گذاشتن دقت کنید )

http://www.barnamenevis.org/forum/showthread.php?t=162940&highlight=Top

Saman_12
یک شنبه 24 مرداد 1389, 22:09 عصر
من قبلا یه فانکشن برای این کار دیده بودم میگردم اگه دیدم براتون میزارم!:متفکر:

ricky22
یک شنبه 24 مرداد 1389, 22:22 عصر
دوستان کل تالار رو زیر و رو کردم.............

یکی از دوستان ....... فکر می کنم به نتیجه رسیده...... که آدرسشو رو می زارم........اگه دوستان می تونن یه نمونه برنامه برام بزارن.......ممنون میشم......

کمک فوری......

( لطفاً به عکس هایی که دوست ایجاد کننده تایپیک گذاشتن دقت کنید )

http://www.barnamenevis.org/forum/showthread.php?t=162940&highlight=Top
شما اصلا کدی را که من دادم امتحان نکردید.
من دوباره امتحان کردم و همانی بود که شما منظورتون هست.
http://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=always+on+top+application+vb.net

Alghoochi
یک شنبه 24 مرداد 1389, 23:03 عصر
دوستمون می خوان که برنامه ای که می نویسن در بالای دسکتاپ قرار بگیره و پنجره های دیگه وقتی Maximize میشن همه تا زیر اون فرم تغییر اندازه بدن. یه چیزی مثل پنجره Jet Audio.

ricky22
یک شنبه 24 مرداد 1389, 23:13 عصر
دوستمون می خوان که برنامه ای که می نویسن در بالای دسکتاپ قرار بگیره و پنجره های دیگه وقتی Maximize میشن همه تا زیر اون فرم تغییر اندازه بدن. یه چیزی مثل پنجره Jet Audio.
بله می دونم
و با همون Top Most کارشون راه می افته

nasim bahari
یک شنبه 24 مرداد 1389, 23:35 عصر
شما اصلا کدی را که من دادم امتحان نکردید.
من دوباره امتحان کردم و همانی بود که شما منظورتون هست.
http://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=always+on+top+application+vb.net

لطفاً یه نمونه برنامه بزارین........

من این کار رو کردم ...اما نتیجه فقط به این صورته که فرم من روی فرم های دیگه قرار میگیره. درحالی که من می خوام پنجره های دیگه وقتی به حالت بزرگ نمایی می رن ، حداکثر اندازه شون تا زیر فرم من باشه که در بالای دسکتاپ قرار داره....متشکرم

ricky22
یک شنبه 24 مرداد 1389, 23:43 عصر
نمونه نمی خواد.
شما در Load form کدی را که در پست 2 دادم بزارید.

nasim bahari
یک شنبه 24 مرداد 1389, 23:50 عصر
نمونه نمی خواد.
شما در Load form کدی را که در پست 2 دادم بزارید.


دوست خوبم........ممنون از اینکه پیگیر هستین........قبل از اینکه در این تایپیک ، پستی ایجاد کنم........Top Most رو امتحان کرده بودم و جواب همونیه که در پست قبلی دادم.......

کمک.....

Saman_12
یک شنبه 24 مرداد 1389, 23:58 عصر
من اون فانکشن رو پیدا نکردم اما خودم یه فانکشن ابتکاری درست کردم که کار میکنه.(وقتی که برنامه دیگه ای Maximize بشه میاد اونو میاره زیر برنامه شما). :کف:
خوب اول باید این این کد ها رو زیر Public Class وارد کنید(آخر این پست یه توضیح کامل در باره کل کد ها میدم):لبخند: :


Private Declare Function IsZoomed Lib "user32.dll" (ByVal hwnd As Integer) As Integer
Private Declare Function GetForegroundWindow Lib "user32.dll" () As Integer
Private Declare Function MoveWindow Lib "user32.dll" (ByVal hwnd As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal bRepaint As Integer) As Boolean
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Integer, ByVal hWndInsertAfter As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer
Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1

خوب اینم اون فانکشن ابتکاری :


Function OnTopAndOnMove(ByVal True_ As Boolean)
If True_ <> True Then
SetWindowPos(Me.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
Exit Function
Else
SetWindowPos(Me.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
Dim HandleActiveWindow As Integer
Dim MaxSize As Integer
HandleActiveWindow = GetForegroundWindow
If HandleActiveWindow <> 0 And HandleActiveWindow <> Me.Handle Then
MaxSize = IsZoomed(HandleActiveWindow)
If MaxSize <> 0 Then
MoveWindow(HandleActiveWindow, 0, Me.Top + Me.Height, _
My.Computer.Screen.WorkingArea.Size.Width, _
My.Computer.Screen.WorkingArea.Size.Height - Me.Height, vbInteger)
End If
End If
End If
End Function

حالا یه تایمر به Form اظافه کنید و کد زیر رو توی رویداد Tick اون بنویسید :

OnTopAndOnMove(True)
:کف:خوب حالا برنامه رو دیباگ کنید و روی یه پنجره امتحان کنید!:کف:
نوبتی هم که باشه نوبت توضیح کد رسیده :لبخند: :
توی اون قسمت اول که زیر Public Class نوشتین ما از چهار API ویندوز استفاده کردیم که عبارت اند از :
IsZoomed این API هندل یک پنجره میگره و چک میکنه که اون پنجره Maximize باشه مقداری غیر 0 بر می گردونه واگه نباشه 0.
GetForegroundWindow این API هندل پنجره فعال رو بر میگردونه.
MoveWindow این API همون اصل کاریه که میاد و پنجره رو زیر بر نامه ما قرار میده.
SetWindowPos این یکی هم یه پیغام می فرسته مثل API SendMessage که توی کد ما پیغام OnTop هست.
قسمت دوم کد ها که همون فانکشنه هست :
توی اولین IF ما چک می کنیم اگه مقدار داده شده به فانکشن True بود فانکشن به کارش ادمه میده و برنامه ی ما OnTop میشه و اگه نبود برنامه ما از حالت OnTop و از فانکشن خارج میشه.
بعد ما میایم و هند پنجره فعال رو میریزیم توی HandleActiveWindow بعد با یه IF چک می کنیم که API با خطایی برخورد نکرده باشه و همچنین هندل ذخیره شده هندل پنجره خودمون نباشه.
بعد هم میایم چک می کنیم که اون پنجره در چه حالتی هست یعنی Maximize یا نه اگه بود با API MoveWindow اونو زیر برنامه خودمون قرار میدیم و اگر نبود که هیچی.
توی کدی هم که داخل تایمر نوشتیم میام به فانکشن مقدار True میدیم تا فانکشن فعال بشه.
تموم شد امید وارم مفید واقع بشه.:قهقهه:

ricky22
یک شنبه 24 مرداد 1389, 23:59 عصر
@nasim bahari
عجب!
میشه نمونه ای که نوشتید و کار نکرده را ضمیمه کنید؟
http://www.freevbcode.com/ShowCode.Asp?ID=4826
http://www.daniweb.com/forums/thread59970.html
http://www.codeguru.com/forum/showthread.php?t=397096
در مقابله یک سری از ShortCut ها مثل WinKey+D باید خودتون مدیریت کنید

Saman_12
دوشنبه 25 مرداد 1389, 00:10 صبح
ricky22 جون اگه ممکن هست اون فایل ضمیمه رو ویرایش کن چون با دات نت 4 کار میکنه vs من 2008 هست به همین دلیل 4 رو نصب ندارم.
باتشکر.

nasim bahari
دوشنبه 25 مرداد 1389, 00:20 صبح
سلام........

با تشکر از دوست خوبم سامان جان.......

کدی که گذاشتی کار میکنه......البته من فکر می کنم باید کد ساده تری هم برای این کار باشه..... و یه راه برای استفاده نکردن از تایمر..........

بازم ممنون از کدی که گذاشتی......

دوستان ....من یک لینک براتون می زارم ( البته دوست خوبمون Riky22 زحمتشو کشیدن ) به زبان C#‎ هستش....اگه همین کار رو میکنه لطف کنین اونو به VB برگردونین......

متشکرم.....

http://www.c-sharpcorner.com/UploadFile/kirtan007/634/

Saman_12
دوشنبه 25 مرداد 1389, 00:53 صبح
سلام........

با تشکر از دوست خوبم سامان جان.......

کدی که گذاشتی کار میکنه......البته من فکر می کنم باید کد ساده تری هم برای این کار باشه..... و یه راه برای استفاده نکردن از تایمر..........

بازم ممنون از کدی که گذاشتی......

دوستان ....من یک لینک براتون می زارم ( البته دوست خوبمون Riky22 زحمتشو کشیدن ) به زبان C#‎‎‎‎ هستش....اگه همین کار رو میکنه لطف کنین اونو به VB برگردونین......

متشکرم.....

http://www.c-sharpcorner.com/UploadFile/kirtan007/634/
نسیم جون اگه می خواید از تایمر استفاده نکنید کافیه فانکشن رو به صورت زیر تعریف کنید اون وقت فانکشن خودش میشه یه تایمر با اینتروال 1 (و هیچ هنگی هم در کار نیست:لبخند:) :


Function OnTopAndOnMove(ByVal True_ As Boolean)
Try
Do While True_
Application.DoEvents()
If True_ <> True Then
SetWindowPos(Me.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
Exit Function
Else
SetWindowPos(Me.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
Dim HandleActiveWindow As Integer
Dim MaxSize As Integer
HandleActiveWindow = GetForegroundWindow
If HandleActiveWindow <> 0 And HandleActiveWindow <> Me.Handle Then
MaxSize = IsZoomed(HandleActiveWindow)
If MaxSize <> 0 Then
MoveWindow(HandleActiveWindow, 0, Me.Top + Me.Height, _
My.Computer.Screen.WorkingArea.Size.Width, _
My.Computer.Screen.WorkingArea.Size.Height - Me.Height, vbInteger)
End If
End If
End If
Loop
Catch ex As Exception
Close()
End Try
End Function

اون کدی هم که لینکش رو قرار داید به نظر میرسه که فقط یه قسمت از کد موجود در فانکشن من باشه که همون OnTop خودمون میشه!!!! :متفکر: