hector2000
چهارشنبه 01 خرداد 1387, 14:29 عصر
با سلام خدمت دوستان
دوستان ما به مشکلی خوردیم که از اساتید تقاضای کمک دارم
مشکل از جایی شروع می شود که ما می خواهیم برای برنامه کنترل شبکه خودمان اقدام به نمایش یک پیغام بصورت ویژه بر روی کامپیوترهای کلاینت کنیم.ما می خواهیم این پیغام بر روی تمام پنجره ها جاری(حتی بازی ها) قرار بگیرد و نمایش داده شود.این کار را دقیقا برنامه ای بنام game port(که با ویژال سی mfc نوشته شده است) انجام میدهد که تمام تلاش ما برای انجام کاری مشابه این برنامه به نتیجه ای نرسیده.
البته ما هم در طول این مدت(سه ماه) بیکار ننشسته بودیم و در فارومهای مختلف (از جمله ماکروسافت) مشکلمان را مطرح کردیم و نمونه کدهای بسیاری را ازمایش کردیم که متاسفانه تا به امروز نتیجه مطلوبی دریافت نکردیم.
بعنوان نسختین روش ما سعی کردیم با استفاده از api پنجره پیغام را on top نگه داریم که متاسفانه ظاهر شدن چنین پنجره ای در حین اجرای بازی باعث از دست دادن فوکوس بازی شده و تقریبا از بازی بیرون می افتید(مثل وقتی که با استفاده از سه کلید معروف بخواهید پنجره taskbar manager را بیاورید) پس این راه به نتیجه نرسید
راه یعدی که ایده ان را یکی از مدیران سایت ماکروسافت و همچنین یکی از کاربران با سایقه سایت برنامه نویس به ما داد بدست اوردن پنجره فعال توسط api و چاپ پیغام با استفاده از api دیگر بر روی ان بود که مشکلاتی را هم این روش داشت
یکی از مشکلات این بود که در حین بازی از انجایی که صفحه نمایش بسرعت ریفرش می شود پیغام ما سریع پاک می شود،ما برای مقابله با این مشکل اقدام به ریفرش کردن پنجره پیغاممان هر یک میلی ثانیه کردیم که در حین بازی متاسفانه وضعیت چشمک زدن را پیدا می کند و نتیجه خوبی ندارد.
تنها راهی که به ذهنمان رسید این بود که با استفاده از یکسری برنامه جاسوسی برنامه game port را زیر نظر بگیریم و ببینیم این برنامه چکار می کند.بعنوان نخستین حرکت توسط یکی از برنامه های spy متوجه شدیم که این پیغام(که توسط برنامه game port ظاهر می شود) اصلا یک پنجره نیست و این برنامه ان را بعنوان یک پنجره شناسایی نمی کند.
قدم بعدی شناسایی api هایی بود که در ان لحظه توسط برنامه استفاده می شد بود که از طریق برنامه api spy موفق به شناسایی ان شدیم(در ادامه متن این شناسایی را می گذارم) ولی در کمال تعجب متوجه شدیم که این برنامه در لحظه مذکور دستور ایجاد یک فرم را اجرا می کند که واقعا ما گیج کرد.
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)
حال از اساتید تقاضای کمک دارم امیدوارم که در این مورد بتوانید به ما کمک کنید
ببخشید یک مقدار طولانی شد
در پیوست:
تصویری از لحظه ای که پیغام توسط گیم پورت چاپ می شود(به رنگ قرمز)
نمونه برنامه در وی بی که از روش بدست اوردن پنجره فعال این کار را می کند
دوستان ما به مشکلی خوردیم که از اساتید تقاضای کمک دارم
مشکل از جایی شروع می شود که ما می خواهیم برای برنامه کنترل شبکه خودمان اقدام به نمایش یک پیغام بصورت ویژه بر روی کامپیوترهای کلاینت کنیم.ما می خواهیم این پیغام بر روی تمام پنجره ها جاری(حتی بازی ها) قرار بگیرد و نمایش داده شود.این کار را دقیقا برنامه ای بنام game port(که با ویژال سی mfc نوشته شده است) انجام میدهد که تمام تلاش ما برای انجام کاری مشابه این برنامه به نتیجه ای نرسیده.
البته ما هم در طول این مدت(سه ماه) بیکار ننشسته بودیم و در فارومهای مختلف (از جمله ماکروسافت) مشکلمان را مطرح کردیم و نمونه کدهای بسیاری را ازمایش کردیم که متاسفانه تا به امروز نتیجه مطلوبی دریافت نکردیم.
بعنوان نسختین روش ما سعی کردیم با استفاده از api پنجره پیغام را on top نگه داریم که متاسفانه ظاهر شدن چنین پنجره ای در حین اجرای بازی باعث از دست دادن فوکوس بازی شده و تقریبا از بازی بیرون می افتید(مثل وقتی که با استفاده از سه کلید معروف بخواهید پنجره taskbar manager را بیاورید) پس این راه به نتیجه نرسید
راه یعدی که ایده ان را یکی از مدیران سایت ماکروسافت و همچنین یکی از کاربران با سایقه سایت برنامه نویس به ما داد بدست اوردن پنجره فعال توسط api و چاپ پیغام با استفاده از api دیگر بر روی ان بود که مشکلاتی را هم این روش داشت
یکی از مشکلات این بود که در حین بازی از انجایی که صفحه نمایش بسرعت ریفرش می شود پیغام ما سریع پاک می شود،ما برای مقابله با این مشکل اقدام به ریفرش کردن پنجره پیغاممان هر یک میلی ثانیه کردیم که در حین بازی متاسفانه وضعیت چشمک زدن را پیدا می کند و نتیجه خوبی ندارد.
تنها راهی که به ذهنمان رسید این بود که با استفاده از یکسری برنامه جاسوسی برنامه game port را زیر نظر بگیریم و ببینیم این برنامه چکار می کند.بعنوان نخستین حرکت توسط یکی از برنامه های spy متوجه شدیم که این پیغام(که توسط برنامه game port ظاهر می شود) اصلا یک پنجره نیست و این برنامه ان را بعنوان یک پنجره شناسایی نمی کند.
قدم بعدی شناسایی api هایی بود که در ان لحظه توسط برنامه استفاده می شد بود که از طریق برنامه api spy موفق به شناسایی ان شدیم(در ادامه متن این شناسایی را می گذارم) ولی در کمال تعجب متوجه شدیم که این برنامه در لحظه مذکور دستور ایجاد یک فرم را اجرا می کند که واقعا ما گیج کرد.
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)
حال از اساتید تقاضای کمک دارم امیدوارم که در این مورد بتوانید به ما کمک کنید
ببخشید یک مقدار طولانی شد
در پیوست:
تصویری از لحظه ای که پیغام توسط گیم پورت چاپ می شود(به رنگ قرمز)
نمونه برنامه در وی بی که از روش بدست اوردن پنجره فعال این کار را می کند