PDA

View Full Version : حرفه ای: قرار دادن یک برنامه در زیر بقیه برنامه ها در vb ( برعکس always on top )



tempali
سه شنبه 28 تیر 1390, 16:46 عصر
سلام
من می خوام یک فرم رو بفرستم بچسبه به دسکتاپ ام و زیر همه برنامه های درحال اجرا قرار بگیره درست برعکس always on top که فرم رو روی همه برنامه و در بالاترین z-order قرار می داد.

محسن واژدی
سه شنبه 28 تیر 1390, 17:40 عصر
سلام علیکم
اگر برنامه تان در حالت allways on top باشد با غیرفعال کردن این ویژگی بخودی خود به عقبتر از سایر فرم ها میرود

موفق باشید

tempali
سه شنبه 28 تیر 1390, 17:55 عصر
شما درست می فرمائید ولی من می خوام حتی زمانی که روی برنامه من کلیک شد روی هیچ برنامه ای قرار نگیره . انگار به background دسکتاپ من چسبیده.

Felony
سه شنبه 28 تیر 1390, 18:04 عصر
شما درست می فرمائید ولی من می خوام حتی زمانی که روی برنامه من کلیک شد روی هیچ برنامه ای قرار نگیره . انگار به background دسکتاپ من چسبیده.
با تابع GetDesktopWindow از User32.dll هندل Desktop رو بگیرید و به عنوان Parent فرم برنامتون قرار بدید .

محسن واژدی
سه شنبه 28 تیر 1390, 18:09 عصر
بنده کدش را نوشته ام منتها توسط FindWindow اما توسط GetDesktopWindow ممکن است بهینه تر باشد:

Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long

Private Sub Command1_Click()
Dim hw&
hw = FindWindow("Progman", vbNullString)
hw = FindWindowEx(hw, 0&, "SHELLDLL_DefView", vbNullString)
hw = FindWindowEx(hw, 0&, "SysListView32", vbNullString)

If hw <> 0 Then
SetParent Me.hWnd, hw
End If

End Sub




موفق باشید

Felony
سه شنبه 28 تیر 1390, 18:20 عصر
بنده کدش را نوشته ام منتها توسط FindWindow اما توسط GetDesktopWindow ممکن است بهینه تر باشد
در بهینه تر بودنش که شکی نیست ، مزیت استفاده از GetDesktopWindow در این هست که تضمین میکنه هندل Desktop رو در هر نسخه ای از ویندوز به شما بده ولی با استفاده از FindWindow ممکنه برنامه شما در نسخه x ویندوز کار نکنه چون ممکنه ClassName پنجره Desktop در همه نسخه های ویندوز یا نسخه های بعدی با ClassName ی که شما به FindWindow پاس دادید یکی نباشه و دستخوش تغییرات بشه که در این صورت کد شما هندل Desktop رو 0 برمیگردونه و کاربردی نداره .

محسن واژدی
سه شنبه 28 تیر 1390, 18:34 عصر
ویندوز فعلی رایانه بنده xp است اما هندل گرفته شده توسط GetDesktopWindow بر روی SetParent عمل نکرد
همچنین هندلی که از طریق FindWindow بدست آمده بود با هندل ارسالی GetDesktopWindowفرق دارد که ممکن است مشکل به این دلیل باشد، بررسی کنید!

موفق باشید

tempali
چهارشنبه 29 تیر 1390, 08:54 صبح
روی سیستم من هم که xp sp3 هست جواب نداد. پنجره ام مخفی میشه!!!

محسن واژدی
چهارشنبه 29 تیر 1390, 09:34 صبح
روی سیستم من هم که xp sp3 هست جواب نداد. پنجره ام مخفی میشه!!!

کدهای پست شماره 5 را بر روی xp تست کرده ام جواب داد البته sp2، شما هم از همین کدها استفاده کرده اید؟

tempali
چهارشنبه 29 تیر 1390, 11:17 صبح
من یک تقویم رومیزی نوشتم و می خوام بره بچسبه به دسکتاپم طوری که انگار با فتوشاپ روی بک گراند طراحی شده.

موضوع رو در سایت vbcity مطرح کردم ولی هیچ جوابی نگرفتم.
مطمئن هستم راه حلی براش وجود داره. اگر برنامه desktop clock که بصورت پیش فرض با ویندوز اکس پی ام.ار.تی نصب میشه رو دیده باشیدگزینه ای داره که ساعت رو به دسکتاپ می چسبونه و حتی اگر روش کلیک راست کنید منوی مربوط به خود دسکتاپ باز میشه.

محسن واژدی
چهارشنبه 29 تیر 1390, 11:36 صبح
اگر برنامه desktop clock که بصورت پیش فرض با ویندوز اکس پی ام.ار.تی نصب میشه رو دیده باشیدگزینه ای داره که ساعت رو به دسکتاپ می چسبونه و حتی اگر روش کلیک راست کنید منوی مربوط به خود دسکتاپ باز میشه.

انتقال فرم به دسکتاپ که قبلا" عرض شد، برای ghost کردن فرم از برنامه زیر استفاده کنید:

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crey As Byte, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long

Const GWL_EXSTYLE = -20, WS_EX_TRANSPARENT = &H20&, WS_EX_LAYERED = &H80000
Const LWA_ALPHA = &H2&

Public Sub GhostMe(hwnd&)
SetWindowLong hwnd, GWL_EXSTYLE, WS_EX_LAYERED Or WS_EX_TRANSPARENT
Opacity = 250
SetLayeredWindowAttributes hwnd, 0, Opacity, LWA_ALPHA
End Sub



نمونه استفاده:
GhostMe Me.hwnd

موفق باشید

vbhamed
پنج شنبه 30 تیر 1390, 09:33 صبح
سلام

نحوه كار اين برنامه ها اينطوريه كه عكس زمينه دسكتاپ رو تو پيكچر باكس خودشون كپي مي كنن بعدش روي اون تقويم رو با دستورات Print و خط و ... رسم
مي‌كنن و بعد عكس حاصل رو به عنوان پس زمينه دسكتاپ قرار مي دن و هيچ فرمي وجود نداره، البته براي اعمال تغييرات عكس اصلي رو جايي نگه مي دارن

Felony
پنج شنبه 30 تیر 1390, 20:31 عصر
ویندوز فعلی رایانه بنده xp است اما هندل گرفته شده توسط GetDesktopWindow بر روی SetParent عمل نکرد
همچنین هندلی که از طریق FindWindow بدست آمده بود با هندل ارسالی GetDesktopWindowفرق دارد که ممکن است مشکل به این دلیل باشد، بررسی کنید!

موفق باشید
من با Delphi و Win 7 تست کردم مشکلی نداشت ...