PDA

View Full Version : چطور hotkey برای فرم تعریف کنیم



tanha70
یک شنبه 09 شهریور 1393, 16:41 عصر
سلام
دوستان من نیاز به کدی دارم که وقتی کاربر یک کلید خاص را فشار داد عمل خاصی انجام شود.
همچنبن این عمل در زمانی که برنامه ما فعال نیست انجام شود.
منظورم اینه حتی برنامه minimize هم باشه این عمل انجام بشه

aminmousavi
یک شنبه 09 شهریور 1393, 18:02 عصر
سلام دوست عزیز.
باید از گلوبال شورت کات استفاده کنی ، که به سیستم عامل شورت کات های نرم افزارت رو معرفی میکنی ، برای انجام اینکار مراحل زیر رو دنبال کن :

- کد های زیر رو در کلاس فرم ات قرار میدی (با فرض اینکه اسم فرمت form1 است ، توی اینجا قرار میدی : public partial class Form1 : Form { ) :

[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);


enum KeyModifier
{
None = 0,
Alt = 1,
Control = 2,
Shift = 4,
WinKey = 8
}


- باید شورت کات های گلوبالت رو به سیستم معرفی کنی ، که با زدن این دکمه های سیستم عامل به نرم افزار شما رجوع کنه ، برای اینکار کد زیر رو درون تابع سازنده فرم تون زیر متد InitializeComponent(); بنویسید )

RegisterHotKey(this.Handle, 0, (int)KeyModifier.None, Keys.F10.GetHashCode());

(در اینجا عدد صفری که وارد شده اهمیت داره ، و بعدا شما از طریق عددی که بنده اینجا صفر وارد کردم متوجه میشد چه دکمه زده شده است ، برای هر دکمه باید یک بار این کد را بنویسید و مقدار عدد و Keys رو تغییر بدید)

- و در آخر کارهایی که باید انجام شود رو مشخص میکنید :


protected override void WndProc(ref Message m)
{
base.WndProc(ref m);


if (m.Msg == 0x0312)
{
Keys key = (Keys)(((int)m.LParam >> 16) & 0xFFFF); // The key of the hotkey that was pressed.
KeyModifier modifier = (KeyModifier)((int)m.LParam & 0xFFFF); // The modifier of the hotkey that was pressed.
int id = m.WParam.ToInt32(); // The id of the hotkey that was pressed.
switch (id)
{
case 0: { } break;
}
}
}


برای هر دکمه (که یک عدد اختصاص دادید ، که در اینجا فقط عدد صفر رو برای کلید F10 مشخص کردم) یک case درون switch قرار میدید و با زدن F10 ، هر کدی که در کیس 0 نوشتید ، اجرا میشود

tanha70
دوشنبه 10 شهریور 1393, 14:59 عصر
با تشکر از شما

هنگام اجرای برنامه با این خطا مشاهده شدم

Unable to load DLL 'user32.d ll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

ارور بالا از کد زیر گرفته شده است.
RegisterHotKey(this.Handle, 0, (int)KeyModifier.None, Keys.F10.GetHashCode());

همچنین من برای این امر از کد شما و کدی که در آدرس زیر میباشد استفاده کردم.
http://www.fluxbytes.com/csharp/how-to-register-a-global-hotkey-for-your-application-in-c/

aminmousavi
دوشنبه 10 شهریور 1393, 15:36 عصر
لینکی که دادید همان کدی هست که براتون گذاشته بودم !
نمیدونم ، تنها چیزی که به ذهنم میرسه اینکه اگر ویندوزتون 64 بیتی هست برای اون باشه ، چون برای من روی 32 بیت جواب میده

tanha70
دوشنبه 10 شهریور 1393, 15:43 عصر
فکر نکنم به دلیل 64 بیتی بودن کامپیوتر من باشد
زیرا از همین کد در برنامه دیگری استفاده کرده ام.

tanha70
دوشنبه 10 شهریور 1393, 15:50 عصر
مشکل را متوجه شدم
در کد شما این قسمت مشکل داشت!!!

user32.d ll