ورود

View Full Version : سوال: نمایش یک پیغام بصورت ویژه



hector2000
جمعه 27 اردیبهشت 1387, 14:55 عصر
با سلام
من دنبال دستور ویا تابعی می گردم که بتواند پیغامی را بصورت ویژه نمایش دهد
احتمالا همه شما تا کنون دکمه منوی مانیتور خود را زدید .مشاهده می کنید پیغام به نحوی نمایش داده می شود که حتی اگر در حین اجرا یک بازی هم باشید این منو و پیغامهای ان بدون مزاحمت و به اصطلاح مستقل از فرمهای ویندوز نمایش داده می شود
دقیقا همین کار در برنامه کنترل شبکه game port هم استفاده می شود
ایا دستوری برای این کار وجود دارد؟

مهران رسا
جمعه 27 اردیبهشت 1387, 15:08 عصر
با یکسری API میشه فرم رو در ویندوز On Top کرد و لی اینکه مثل منوی مونیتور باشه فکر نمی کنم امکان پذیر باشه ...

hector2000
جمعه 27 اردیبهشت 1387, 15:44 عصر
با یکسری API میشه فرم رو در ویندوز On Top کرد و لی اینکه مثل منوی مونیتور باشه فکر نمی کنم امکان پذیر باشه ...

ولی من برنامه هایی سراغ دارم که این کار را می کنند(مثل game port)
فرض کنید در حین انجام یک بازی چنانچه پیغام در قالب یک فرم بیایید باعث از دست دادن فوکوس بازی می شویم(فرض کنید در حین برنامه taskbarmanager را با کلیدهای ctl+alt+del بیاوریم)

ali_habibi1384
شنبه 28 اردیبهشت 1387, 15:30 عصر
این یک نمونه فرم show modal هستش.

hector2000
شنبه 28 اردیبهشت 1387, 19:16 عصر
دوستی در یکی از فارومهای خارجی به من پیشنهاد داده که از توابع directx برای این کار استفاده کنم
نظر دوستان چیه؟
ایا نمونه کدی سراغ دارید؟

.:KeihanCPU:.
شنبه 28 اردیبهشت 1387, 19:24 عصر
توابع Directx ???
منم خواهانش شدم
ولی فکر نکنم مثل منوی مانیتور بشه دیگه نهایتش مثل TskMgr میاد

vbhamed
شنبه 28 اردیبهشت 1387, 19:31 عصر
سلام
فكر مي كنم از اين روش هم بشه
با توايع Api هندل فرم جاري رو بدست بياريد
با همون توابع Api روي فرم جاري بنويسيد
فكر كنم توابع زير مي تونه كمك كنه



Public Declare Function GetActiveWindow Lib "user32" Alias "GetActiveWindow" () As Long


Public Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long

Public Declare Function DrawTextEx Lib "user32" Alias "DrawTextExA" (ByVal hDC As Long, ByVal lpsz As String, ByVal n As Long, lpRect As RECT, ByVal un As Long, lpDrawTextParams As DRAWTEXTPARAMS) As Long

.:KeihanCPU:.
شنبه 28 اردیبهشت 1387, 19:38 عصر
فكر مي كنم از اين روش هم بشه
با توايع Api هندل فرم جاري رو بدست بياريد
با همون توابع Api روي فرم جاري بنويسيد
فكر كنم توابع زير مي تونه كمك كنه

آیا با این کار میشه منویی مانند منوی مانیتور داشت؟

مهران رسا
شنبه 28 اردیبهشت 1387, 20:29 عصر
باز هم امکان پذیر نیست ...

hector2000
یک شنبه 29 اردیبهشت 1387, 22:15 عصر
با استفاده از GetActiveWindow تونستم پنجره فعال را بدست بیارم و با استفاده از DrawText تونستم بر روش متنی را چاپ کنم اما بدلیل اینکه مثلا در بازی ها صفحه دائم ریفرش می شه پیغامم پاک میشه.البته من با استفاده از یک تایمر تونستم هر میلی ثانیه این متن را ریفرش کنم ولی زیاد ظاهر جالبی پیدا نمی کنه و تقریبا حالت چشمک زدن را پیدا می کنه ایا راه بهتری وجود دارد که این مشکل را بتوان حل کرد؟

مهران رسا
یک شنبه 29 اردیبهشت 1387, 22:48 عصر
میشه نمونه کدی که نوشتید رو ضمیمه کنید ؟!

hector2000
سه شنبه 31 اردیبهشت 1387, 16:10 عصر
با سلام
پس از اینکه برنامه game port را توسط api spy و api monitor انالیز کردم توانستم متوجه شوم که در لحظه ای که دستور ایجاد پیغام ویژه صادر می شود چه api هایی فراخوانی می شود
این برنامه(game port) با زبان Visual c نوشته شده ولی لیست api های ان توسط هر زبان دیگری قابل استفاده است




77C30212:WriteFile(HANDLE:000000DC,LPDATA:0012D138 ,DWORD:00000029,LPDATA:0012D11C,LPDATA:00000000)
77C30218:WriteFile = 1 (msvcrt.dll)
77C30212:WriteFile(HANDLE:000000DC,LPDATA:0012D138 ,DWORD:0000002F,LPDATA:0012D11C,LPDATA:00000000)
77C30218:WriteFile = 1 (msvcrt.dll)
77C30212:WriteFile(HANDLE:000000DC,LPDATA:0012D048 ,DWORD:0000002C,LPDATA:0012D02C,LPDATA:00000000)
77C30218:WriteFile = 1 (msvcrt.dll)
77C30212:WriteFile(HANDLE:000000DC,LPDATA:0012D044 ,DWORD:00000027,LPDATA:0012D028,LPDATA:00000000)
77C30218:WriteFile = 1 (msvcrt.dll)
73DDF118:CreateDialogIndirectParamA(HANDLE:0040000 0,LPDATA:004F1E00,HWND:006603FA,LPDATA:73DD6745,DW ORD:00000000)
5AD779D2: lstrlenW(LPWSTR:5AD774EC:"Window")
5AD779D4: lstrlenW = 6 (uxtheme.dll)
755DD307: GetSystemDirectoryW(LPWSTR:0012BDDC,DWORD:00000105 )
755DD30D: GetSystemDirectoryW = 13 (msctfime.ime)
755DD33E: lstrlenW(LPWSTR:755C2440:"Msimtf.dll")
755DD344: lstrlenW = A (msctfime.ime)
755DD53F: GetModuleHandleW(LPWSTR:0012BDDC:"D:\WINDOWS\system32\Msimtf.dll")
755DD545: GetModuleHandleW = 0 (msctfime.ime)
73DDF11E:CreateDialogIndirectParamA = 5E0380 (MFC42.DLL)




دوستان منتظر پاسخهاتون هستم

hector2000
سه شنبه 31 اردیبهشت 1387, 19:15 عصر
میشه نمونه کدی که نوشتید رو ضمیمه کنید ؟!

کد من شبیه این نمونه کد است.(البته برنامه من متن را چاپ می کند)

a_mohammadi_m
شنبه 08 تیر 1387, 13:21 عصر
با سلام
به نظر من بايد اينكار رو بكنيد
1- بدست آوردن هندل پنجره فعال فعلي ( GetActiveWindow )
2- نمايش پنجره پيغام مورد نظر به صورت OnTop ولي با حالت شفافيت مثلا 50 درصد
3- فعال كردن دوباره پنجره قبلي بدون بستن پنجره پيغام و بدون از دست دادن حالت OnTop آن