ايران ويج

نسخه‌ی کامل: غير فعال كردن Print Screen از صفحه كليد
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
خيلي ممنون كه بازم جواب دادين

ميدونم الان پيش خودتون دارين به من ميگين ... (نشنوم گفتي ها!!!)

ولي من بازم نفهميدم اگر وقت ياريتان كرد و دوست داشتين يكم بيشتر توضيح بدين

اگر هم نشد كه هيچي ديگه بازهم ممنون
یه سری به اینجا بزنید.http://forum.iranled.com/showthread.php?tid=5910
سلام.
اینم مثال از هوک.
سلام و تشكر

باز هم مطالبي جديد از دوستان اينترنتي از نوع ايرانويجي ياد گرفتم

خيلي ممنون
خب من یه مقاله کامل در مورد هوک نوشته دارم بخشی از اون رو براتون میگزارم تا راحتر متوجه بشید


Hook چیست

Hook یک تابع callback میباشد که به برنامه ما این امکان را میدهد تا اطلاعات قبل از رسیدن به مقصد انها را دریافت کند و hook میتواند این اطلاعات را قبل از رسیدن به مقصد وارسی یا تغییر دهد ویندوز دارای هوک های مختلفی میباشد که هر نوع به منضور دسترسی به اطلاعات خاصی طراحی شده اند بطور مثال میتوان با استفاده از WH_MOUSE hook پیغامهای مربوط به موس را مانیتور کرد هنگامی که برنامه ما از یکی این تابع callback که انرا hook procedure می نامنداستفاده میکند هنگامی که پیغامی که وابسته به ان هوک باشد ارسال شود ویندوز ان پیغام را به hook مورد نظر که به ثبت رسیده باشد ارسال میکند
لیستی از hook procedure در زیر امده است
CallMsgFilter CallWndProc CallWndRetProc CBTProc DebugProc GetMsgProc
ForegroundIdleProc JournalPlaybackProc JournalRecordProc KeyboardProc MessageProc MouseProc ShellProc SysMsgProc

برای استفاده از یک هوک ابتدا باید انرا نصب نمود(انرا به ویندوز معرفی کرد مدیریت هوک ها را بخشی بنام chain hook بر عهده دارد)
2نوع هوک وجود دارد LocalHook و System Wide Hook
Local Hook بر روی یک برنامه یا یک thread نصب می شود و کدها درون برنامه قرار می گیرد اما System Wide Hook بر روی همه برنامه ها و Therad ها اجرا می شود و کدها باید درون dll قرار بگیرد
برای نصب هوک در hook chain ما از تابع SetWindowsHookEx استفاده میکنیم این تابع 3 پارامتر دارد و مقداری که بر میگرداند id هوک نصب شده در hook chain می باشد
Hook chain بخشی ار سیستم عامل می باشد که hook ها در انجا ثبت می شوند

کد:
HHOOK SetWindowsHookEx(
    int idHook,
    HOOKPROC lpfn,    
    HINSTANCE hMod,
    DWORD dwThreadId )

پارامتر idHook نمایانگر نوع هوکی هست که میخواهیم نصب کنیم

WH_CALLWNDPROC:مانیتور کردن پیغامها قبل از رسیدن به پنجره هدف
WH_CALLWNDPROCRET:مانیتور کردن پیغامها بعد ار ارسال به پنجره هدف
WH_CBT:برای مانیتور کردن اعلانات برنامه های computer-based training
WH_DEBUG:برای اشکال زدایی هوک های دیگرمناسب میباشد
GetMsgProc:برای مانیتور کردن system calls هنگامی که یک message از برنامه ای دریافت میکند
ForegroundIdleProc:مانیتور کردن بیکار idle بودن thread ریسمان مورد نظر
WH_GETMESSAGE :برای مانیتور کردن پیغامهایی که به صف پیغامهای یک پنجره post می شود
WH_JOURNALPLAYBACK:ارسال پیغامی که قبلا توسط این هوک ذخیره شده است
WH_JOURNALRECORD :پیغامهایی را که به system message queueارسال می شود را ذخیره میکند
WH_KEYBOARD:مانیتور کردن کلیدهای فشرده شده
WH_MOUSE:مانیتور کردن فعالیت های موس
WH_MSGFILTER:مانیتور کردن پیغامهایی(event message) که توسط dialog box, message box, menu, یا scroll barایجاد می شود
WH_SHELL:برای مانیتور کردن اعلانات notification های برنامه های shell
WH_SYSMSGFILTER: مانیتور کردن پیغامهایی(event message) که توسط dialog box, message box, menu, یا scroll barایجاد می شود برای تمام برنامه ها

Lpfn یک مقدار از نوع اشاره گر که به ادرس تابع هوک اشاره میکند

hMod شناسه dll که تابع hook در ان قرار دارد
dwThreadId مشخص کننده thread ریسمانی میباشد که هوک بر روی ان نصب می شود

برای غیر فعال کردن hook از تابع UnhookWindowsHookEx استفاده می شود که دارای 1 پارامتر میباشد

کد:
BOOL UnhookWindowsHookEx( HHOOK hhk );

Hhk : هندل تابع هوک مورد نظر میباشد

برای ارسال اطلاعات به هوک بعدی درhook از تابع CallNextHookEx استفاده می شود زیرا ممکن است بر روی سیستم چندین هوک نصب شده باشد
سلام
بازم تشكر
مفيد بودClap

اگر ميشه يك مثال كاربردي رو توضيح بدين (كد نباشه هم مهم نيست فقط كاربردش رو بهتر بفهمم كد بود كه بهتر)
راستي اگه نخايم از هوك استفاده كنيم چي؟ جايگزين؟Question


راستي آقا پيمان كد خوبي دادين يكسري چيزهاي جديد ياد گرفتم
ولي نفهميدم دقيقا چكار ميكنه اگه شد يكم راجع بهش توضيح بدين لطفا!


در كل از دوستان تشكر ميكنم
ببینین معماری ویندوز بر پایه پیغامها هست وقتی شما مثلا رو یه دکمه کلیک میکنین یه پیغام به WM_LBUTTONDOWN با استفاده از تابع sendmessage به برنامه مورد نظر فرستاده میشه در هر برنامه در حال اجرا یک تابع peekmessage برای گرفتن پیغامها و یک تابع WindowProc برای پردازش پیغامهای دریافتی وجود داره وقتی وقتی WindowProc پیغامی دریافت میکنه از رو پارامترهای sendmessage مثل handle میفهمه که این پیغام مربوط به کدام کنترل هست و از روی نوع پیغام هم میفهمه چه عملی انجام شده و کدام رویداد یا دستورات باید اجرا بشه

حالا مثلا ما به notepad یک منوی جدید اضافه کردیم یا مثلا میخواهیم کنترل کنیم که روی برنامه ما کلید prt-sc فشرده شده یا نه در اینجا ما از هوک استفاده میکنیم هوک میاد و واسط میشه بین سیستم عامل و برنامه ما و این پیغامها قبل از رسیدن به برنامه مقصد به هوک میرن و بعد از اون به برنامه میرسن اینجوری وقتی دقیقا روی برنامه شما دکمه printscreen فشار داده بشه قبل از ارسال این دکمه به برنامه مورد نظر هوک شما اونو دریافت میکنه و شما متوجه میشین یا میتونین این دستور رو از صف پیامها حذف کنین انگار هیچ اتفاقی نیفتاده یا میتونین کلیپبورد رو پاک کنین یا در مورد همون نوت پد وقتی شما اون منو رو انتخاب میکنین باید عمل مورد نظر شما انجام بشه پس باید متوجه کلیک شدن روی منویی که اضافه کردین بشین اینجا هم با یه هوک میشه متوجه شد که کدام item از منو کلیک شده و اگه منویی که شما اضافه کردین بود عمل مورد نظر شما اعمال بشه
سلام

بسيار عالي بود.


از دوستان مچكرم
حالا بزار منم جنیه های دیگه ای ازشو بهت بگم تا قبل از استفاده بیشتر بهش دقت کنی هر چند به نظر من استفاده از hook بیشتر پاک کردن صورت مسیله است !
فرض کن من برنامه نویس انجمن اسلامی هستم و این انجمن به من پیشنهاد پلاگین قران برای Notepad ویندوز به من داده .
خوب یه پروژه جدید باز میکنم (فرض بر VB6)
مشکلاتی که در این پروژه به آن قطعاً بر میخوریم .
الف ) برنامه من باز نباشد .
ب ) ...
راه حل :
برنامه خود را در run ویندوز میزاریم تا همیشه اول سیستم بیاد بالا یه timer قرون وسطی هم تو برنامه میزاریم تا چک کنه هر موقع Notepad باز شد یقشو بگیره و یه منو بهش اضافه کنیم .
ولی چون سال 2009 بعد میخندیم عجب کار مسخره ای چون با این کار کلی از منابع سیستم و پروسه مربوط به برنامه خودمون گرفتیم . روش عوض میکنیم چون امروزه کلمه thread باب شده از اون استفاده کنیم .
اینجوری پروسه خودمون دیگه کارش کم میشه ولی چون vb6 در برابر ترد ها flexibility نداره (نمیدونم چرا ) یه نسخه به عقب بر میگردیم و از vb5 استفاده میکنیم . تا اینجا بد نشد و همه چیز از دید کاربر 0 پنهانه . ولی مشکل بازم اینه که اصغر آقا سبزی فروش هر روز برای اینکه مبادا ویروس گرفته باشه msconfig چک میکنه وقتی اسم برنامه ما رو میبینه دکمه del میزنه .
این بار برنامه نویس شعر سهراب میخونه که میگه باید چشمها را شست جور دیگه باید دید . از روش ویروسی خودش دست بر میداره و میره تو فرمش یه دکمه میزاره تا از اون طریق برنامه notepad باشه . البته برای کارمندان اون انجمن خیلی عجیبه چون تا حالا هیچ پلاگینی رو ندیدن که اینجوری از طریق یه برنامه دیگه باید بالا چون رو کامپیوترشون فتوشاپ دارن و اون خودش پلاگینها رو load میکنه .
برنامه نویس انجمن بالاخره کارمندای انجمن راضی میکنه که این با بقیه فرق داره ...
میاد منو رو اضافه میکنه بعد میفهمه کار سختش اینجاشه .
برای اینکار میاد به ویندوز میگه تمام message های منو notepad قبل از فرستاده شدن بده من چک کنم .
و چون قلابه هر آشغالی که به دستش میرسه رو به این میده و چون بیشترین چیزی که از cpu بازه زمانی بیشتری میگیره دستورات شرطی برنامه نویس مدام باید چیزهای آشغال چک کنه تا به ماهی برسه .
در آخر ناگفته نمونه امکان داره نسخه های متعدد ویندوز هم این وسط بازیش بگیره و انتی ویروس ها و هزار تا چیز دیگه ...
در آخر برنامه نویسه موندو حوضش
قصه ما به سر رسید hook به خونش نرسید .
سلام و تشكر
مثال بسيار خوبي زدين

ميگم توي دات نت جايگزيني براي هوك وجود دارد (از كلاسهاي دات نت)؟
کاربرد hook بیشتر در windows برای برنامه هایی هست که اصلا به هم مرتبط نیستند و میخواهیم بین آن 2 پلی برقرار کنیم . خود من مثلا تو پروژه ای میخواستم کاربر یه سری محاسبات با ماشین حساب انجام بده و نتیجه رو تو یه textBox بریزه 2 راه داشتم یا چرخو دوباره اختراع کنم (یعنی ماشین حساب بنویسم ) و یا از چرخ های موجود استفاده کنم .
من راه دوم انتخاب کردم و با استفاده از hook هر موقع کاربر کلید مساوی میزد نتیجه رو به textBox خود میریختم .
همیشه قبل از اینکه شروع به کد کنی قبلش target مشخص کن میخوای چی کار کنی . شاید اگر میخواستم calculator برام پشتکم بزنه میرفتم از اول مینوشتمش ولی چون پشتک نداشت همون برام کفایت کرد .
(مثال پلاگین هم از این نوعه)

اینجا هم 2 تا بحثه بین برنامه های خودت میخوای ارتباط برقرار کنی یا نرم افزار شرکتهای دیگه .
اگر نرم افزار مال شرکت دیگست فعلا تنها راه همین هوکه البته microsoft خیلی دوست داره جایگزینی برای این سیستم messaging پیدا کنه ولی فعلا که فکر میکنم امکانش نباشه ولی تو نرم افزار های خودت داستان فرق میکنه
امیدوارم کامل بوده باشه ...
صفحه‌ها: 1 2