PDA

View Full Version : تعریف کلید دسترسی به سطح بالا در ویندوز



AliReza Vafakhah
دوشنبه 03 اسفند 1394, 17:20 عصر
دوستان سلام

همینطور که میدونید با تابع RegisterHotKey میشه یه کلید دسترسی در حالت Global تعریف کرد.

مشکل من اینجاست که اگر من مثلا کلید دسترسی Ctrl + Z رو تعریف کنم و اگر یه برنامه دیگه هم همین کلید رو درحالت Global تعریف کرده باشه اون وقت رویداد کلید تو اون برنامه رخ میده و مانع میشه که برنامه من کلید دسترسی تعریف شده رو کپچر کنه.

میخوام اگر میشه بتونم کلید دسترسی برنامه خاص رو UnRegister کنم یه یه کاری کنم کلید دسترسی من بالاتر از اون قرار بگیره.

Mask
سه شنبه 04 اسفند 1394, 09:01 صبح
با تابع UnRegisterHotKey هندل برنامه دوم رو بگیر و بهش پاس بده.

AliReza Vafakhah
چهارشنبه 05 اسفند 1394, 07:04 صبح
با تابع UnRegisterHotKey هندل برنامه دوم رو بگیر و بهش پاس بده.

تشکر
ولی خوب چطور متوجه بشم که مثلا کلید دسترسی Ctrl+Alt+9 توسط فلان برنامه استفاده میشه؟
و کلید های دسترسی یه ID هم دارن ، مجددا ID رو از کجا پیداکنم که UnRegister کنم؟

Mahmood_M
چهارشنبه 05 اسفند 1394, 10:12 صبح
به راحتی نمی تونید اطلاعات HotKey رجیستر شده رو بدست بیارید

مشکل من اینجاست که اگر من مثلا کلید دسترسی Ctrl + Z رو تعریف کنم و اگر یه برنامه دیگه هم همین کلید رو درحالت Global تعریف کرده باشه اون وقت رویداد کلید تو اون برنامه رخ میده و مانع میشه که برنامه من کلید دسترسی تعریف شده رو کپچر کنه.
مشکل کپچر نکردن نیست ، بلکه مشکل اینجاست که HotKey شما اصلا رجیستر نمیشه ، اگر قبلا همون کلید ها رجیستر شده باشه
هر کلید HotKey با یک Handle و یک ID و مهمتر از اونها با Thread ای که اون رو رجیستر کرده شناخته میشه و فکر می کنم که ویندوز اجازه ی UnRegister کردن یک HotKey توسط یه Thread دیگه رو نمیده، اگر Thread مالک Hotkey خودش اون رو UnRegister نکنه ، ویندوز در هنگام پایان کار Thread منابع اون رو آزاد میکنه و احتمالا همین HotKey هم آزاد میشه
برای این کار شما باید برید سراغ Hook و برای کلید مورد نظرتون قلاب بذارید !

AliReza Vafakhah
پنج شنبه 06 اسفند 1394, 05:45 صبح
به راحتی نمی تونید اطلاعات HotKey رجیستر شده رو بدست بیارید

مشکل کپچر نکردن نیست ، بلکه مشکل اینجاست که HotKey شما اصلا رجیستر نمیشه ، اگر قبلا همون کلید ها رجیستر شده باشه
هر کلید HotKey با یک Handle و یک ID و مهمتر از اونها با Thread ای که اون رو رجیستر کرده شناخته میشه و فکر می کنم که ویندوز اجازه ی UnRegister کردن یک HotKey توسط یه Thread دیگه رو نمیده، اگر Thread مالک Hotkey خودش اون رو UnRegister نکنه ، ویندوز در هنگام پایان کار Thread منابع اون رو آزاد میکنه و احتمالا همین HotKey هم آزاد میشه
برای این کار شما باید برید سراغ Hook و برای کلید مورد نظرتون قلاب بذارید !

تشکر

میشه در رابطه با قلاب یا هوک بیشتر راهنمایی کنید

Mahmood_M
پنج شنبه 06 اسفند 1394, 06:36 صبح
روش کار به این صورته که شما یک Function می نویسید و اون رو برای یک رویداد خاص در ویندوز ثبت می کنید که هر زمان اون رویداد خاص اتفاق افتاد، Function شما اجرا بشه، قبل از اینکه ویندوز اون رویداد رو به Handle یا Thread مقصد اصلی بفرسته
Hook به 2 صورت انجام میشه، یا Local که ویندوز فقط رویداد های یک Thread خاص رو به تابع شما ارجاع میده و یا Global که رویداد در سطح ویندوز مانیتور میشه و هر جایی اون رویداد رخ بده ، قبل از ارسال به مقصد اصلی، تابع شما اجرا میشه
در مورد حالت Global که فکر می کنم هدف شما هم همین حالت هست، نکته اینه که تابع مورد نظر باید همیشه در دسترس باشه، به خاطر همین نباید درون برنامه اصلیتون بنویسید، بلکه باید درون یک DLL بنویسید و آدرس فضای تابع رو به ویندوز بدید
تابع SetWindowsHookEx و UnHookWindowsHookEx رو جستجو کنید، مثالهای دلفی هم زیاد هست در این مورد

AliReza Vafakhah
پنج شنبه 06 اسفند 1394, 16:15 عصر
روش کار به این صورته که شما یک Function می نویسید و اون رو برای یک رویداد خاص در ویندوز ثبت می کنید که هر زمان اون رویداد خاص اتفاق افتاد، Function شما اجرا بشه، قبل از اینکه ویندوز اون رویداد رو به Handle یا Thread مقصد اصلی بفرسته
Hook به 2 صورت انجام میشه، یا Local که ویندوز فقط رویداد های یک Thread خاص رو به تابع شما ارجاع میده و یا Global که رویداد در سطح ویندوز مانیتور میشه و هر جایی اون رویداد رخ بده ، قبل از ارسال به مقصد اصلی، تابع شما اجرا میشه
در مورد حالت Global که فکر می کنم هدف شما هم همین حالت هست، نکته اینه که تابع مورد نظر باید همیشه در دسترس باشه، به خاطر همین نباید درون برنامه اصلیتون بنویسید، بلکه باید درون یک DLL بنویسید و آدرس فضای تابع رو به ویندوز بدید
تابع SetWindowsHookEx و UnHookWindowsHookEx رو جستجو کنید، مثالهای دلفی هم زیاد هست در این مورد

خیلی ممنون ، راهنمایی هاتون متین بود فقط میشه یه نمونه هوک شما قرار بدین چون من یه هوک صفحه کلید دارم که فقط تو ویندوز XP جواب میده و تو ویندوز 7 ، 8 ، 10 جواب نمیده ، البته چندنمونه دیگه هم امتحان کردم که با ویندوز 7 یه به بعد خطای حافظه میداد.

AliReza Vafakhah
سه شنبه 11 اسفند 1394, 02:16 صبح
تمام نمونه هوک هایی که تو سایت هستن و هوک توسط dll انجام میشه رو تقریبا تست زدم و نتونستم در تمام نسخه های ویندوز جواب درست بگیرم و کلا بی خیال هوک توسط dll شدم تا یه کامپوننت خیلی عالی همراه با سورس از یه برنامه نویس چینی با هزار دنگ و فنگ گرفتم که واقعا عالیه و نیاز به dll نداره. من تمام نت رو جستجو زدم هیچ جا این کامپوننتی که الآن میگذارم نبود ولی من اینجا قرار میدم تا دوستان دیگه هم استفاده کنند.