Ctrl Alt Del رو نه. در سیستم عامل های قدیمی میشد ولی چون یک ترکیب کلیدی سیستمی ئه دیگه به برنامه ها اطلاع داده نمیشه.
SetWindowsHookEx
مساله اینه که کی ببینه. اگر منظورتون خود کنترل ئه، دیده که این متد فراخوانی شده، خود ProcessDialogKey به دیدن کاری نداره.
بحث دیدن نیست. کلید با یکسری سلسله مراتب بررسی میشه. اینکه true برگردونه معنی اش اینه که این کلید اینجا پردازش شد و کارش به پایان رسید، سلسله مراتب بررسی در اینجا تموم شد.
کنترل خودش با IsInputKey مشخص می کنه که برایش فلان کلید تعریف شده و وظیفه ای داره یا کاری باهاش نداره. اگه بگه Tab برای من تعریف شده، دیگه به اینجا نمیرسه و جزو DialogKey ها نخواهد بود. چطور که کلید های بالا و پایین برای بعضی کنترل ها کاربرد دارند. هر کنترلی برای یکسری کلید ها کاری برای انجام داره، برای سایر کلید ها نداره. فرضا ممکنه یک TextBox بخواد با Enter سطر جدید ایجاد کنه، قرار نیست برای همه کنترل ها Enter یک DialogKey محسوب بشه. یک کنترلی با Tab ممکنه مقدار عوض کنه. این چیزی نیست که از قبل برای فرم مشخص باشه. برای همین زمانی که کلیدی توسط کنترل به عنوان کلید عادی پردازش نشد در این متد ProcessDialogKey بررسی میشه که کاری رویش انجام میشه یا نه.
رویداد Click یک رخداد خارجیه، باید جایی فراخوانی بشه تا اتفاق بیافته، باید Invoke بشه. و Invoke شدنش هم توسط OnClick یا هر متد دیگه ای که اینکار رو بکنه انجام میشه، نه خود به خودی.
حالا وقتی شما OnClick رو از کار بندازید، Invoke شدن Click رو حذف کردید، رخداد Click خود به خود که رخ نمیده. پس Click رو هم به هر متدی متصل کنید بی فایده است و دیگه رخ نخواهد داد چون Invoke اش جایی اتفاق نمی افته.
Control یک کلاس عمومی ئه، قرار نیست Click همه Control ها عین هم باشه. ممکنه شما لازم باشه روی موقعیت خاصی از کنترلی کلیک کنید تا Click حساب بشه، شاید لازمه شرایط خاصی باشه تا Click رخ بده. پس لازمه که OnClick ای باشه که بتوانید مراحل رخ دادن رخداد Click رو تغییر بدید. اگه OnClick ای در کار نبود یا Virtual نبود، تغییر دادن روال Click برای Control های سفارشی سخت میشد. همه On ها همینطور هستند.