PDA

View Full Version : سوال: ایجاد کلید shortcut برای کنترلرهای برنامه



farhad nadimi
شنبه 17 مهر 1389, 13:22 عصر
با سلام

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

اون بجای اینکه با موس بره روش و کلیک کنه همانند دیگر برنامه ها با زدن کلید میانبر اقدام به

انجام اون کار بکنه که سرعت عمل کاربر در برنامه رو بالا می بره و هم باعث محبوبیت برنامه نزد

کاربر میشه این برنامه در #C نوشته شده اگر امکان داره با سورساتون کمکم کنین ممنون

می شم چون در اینترت گشتم و چیزی به چشم نخورده و یا قانعم نکرده.

AmirAmiri
شنبه 17 مهر 1389, 14:24 عصر
سلام دوست عزیز.
برای اینکار ابتدا باید خاصیت KeyPreview فرم رو true کنی و بعد کد زیر رو توی رویداد KeyUp فرم بنویس :
private void ShortcutKeys(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.F5:
{ /* Clear Text Boxs */; break; }
case Keys.F2:
{ /* Edit void name */; break; }
case Keys.Escape:
{ this.Close(); break; }
}
}

هر کلید دیگه ای که خواستی میتونی بعریف کنی و زمانی که توی فرم هر کدوم از این کلید ها رو فشار بدی، این رویداد اجرا میشه و کده مربوط به کلید مورد نظر رو اجرا میکنه.
خیلی سادست امیدوارم به دردت بخوره.
موفق و پیروز باشی.

babak.h
شنبه 17 مهر 1389, 14:35 عصر
سلام

در تکمیل حرف دوستمون :

1- اگر می خواید برای یک دکمه یا منو یا هرچیز دیگه ای shortcut بگذارید و این shortcut یکی از حروف text آن باشد. است کافی است قبیل از اون حرف علامت & قرار بدید
مثلا اگر یک دکمه دارید که text اون هست "Cancel" و می خواهید با زدن دکمه "n" از روی کی بورد این دکمه صدا زده شود، text آن را بصورت "Ca&ncel" بنویسید.

2- اگر می خواهید از کلید های ترکیبی استفاده کنید، مثلا Alt+T یا هر چیز دیگه ای می توانید متد ProcessDialogKey فرم را override کنید.

به کد زیر توجه کنید :


protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == (Keys.Control | Keys.A))
{
//Do Something
}
return base.ProcessDialogKey(keyData);
}با این کد، با زدن دکمه Ctrl+A ، کار مورد نظر انجام می شود


موفق باشید

farhad nadimi
شنبه 17 مهر 1389, 14:55 عصر
با سلامی مجدد خدمت شما دوست عزیز ممنون راهنمایی شما بسیار سازنده بود ولی مشکلی

که برام پیش اومده و سعی در اصلاح اون دارم تلاش می کنم ولی گفتم بپرسم که مثلا می خوای

کد مربوط به فلان دکمه رو از فرم با زدن کلید shortcut اجرا کنی اون موقع چطوری دستور اون

کنترل مثلا button رو فراخوانی می کنی آیا با فراخوانی های عادی که انجام می دیم برای هر روال

از توابع یا چطوری ممنون از راهنماییت

AmirAmiri
شنبه 17 مهر 1389, 15:00 عصر
فکر کنم همون مثالی که زدم گویای همه چیز بود اما بازم با یک مثاله دیگه کامل ترش میکنم.
private void ShortcutKeys(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.F5:
{ btnNew_Click(new object(),new EventArgs()) ; break; }
case Keys.F2:
{ btnAdd_Click(new object(),new EventArgs()); break; }
case Keys.Escape:
{ this.Close(); break; }
}
}

robat7
شنبه 17 مهر 1389, 15:07 عصر
سلام
شما نیاز به کلاس زیر دارید

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace DCC_Utility
{
class Hotkeys
{
//http://www.dreamincode.net/forums/topic/180436-global-hotkeys/
[DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);

[DllImport("user32.dll")]
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);

private int modifier;
private int key;
private IntPtr hWnd;
private int id;

public static class Constants
{
//modifiers
public const int NOMOD = 0x0000;
public const int ALT = 0x0001;
public const int CTRL = 0x0002;
public const int SHIFT = 0x0004;
public const int WIN = 0x0008;

//windows message id for hotkey
public const int WM_HOTKEY_MSG_ID = 0x0312;
}

public Hotkeys(int modifier, Keys key, Form form)
{
this.modifier = modifier;
this.key = (int)key;
this.hWnd = form.Handle;
id = this.GetHashCode();
}
public override int GetHashCode()
{
return modifier ^ key ^ hWnd.ToInt32();
}
public bool Register()
{
return RegisterHotKey(hWnd, id, modifier, key);
}

public bool Unregiser()
{
return UnregisterHotKey(hWnd, id);
}

}
}


به تعداد Hotkey های مورد نیاز متغیر در اول فرم خود تعریف کنید

Hotkeys ghk;
Hotkeys ghk1;
Hotkeys ghk2;
Hotkeys ghk3;


در constructor فرم مقادیر HotKey را تعریف نمایید

InitializeComponent();

ghk = new Hotkeys(Hotkeys.Constants.CTRL, Keys.OemSemicolon, this);
ghk1 = new Hotkeys(Hotkeys.Constants.CTRL, Keys.I, this);
ghk2 = new Hotkeys(Hotkeys.Constants.CTRL, Keys.O, this);
ghk3 = new Hotkeys(Hotkeys.Constants.CTRL, Keys.B, this);

این چهار روتین را به فرم خود اضافه نمایید

private Keys GetKey(IntPtr LParam)
{
return (Keys)((LParam.ToInt32()) >> 16); // not all of the parenthesis are needed, I just found it easier to see what's happening
}

protected override void WndProc(ref Message m)
{
if (m.Msg == Hotkeys.Constants.WM_HOTKEY_MSG_ID)
switch (GetKey(m.LParam))
{
//case Keys.OemSemicolon:
// HandleHotkey();
// break;
case Keys.I:
toolStripButton2_Click(null, null);
break;
case Keys.O:
toolStripButton3_Click(null, null);
break;
case Keys.B:
toolStripButton4_Click(null, null);
break;
case Keys.E:
toolStripButton5_Click(null, null);
break;
case Keys.D:
toolStripButton6_Click(null, null);
break;
case Keys.Q:
toolStripButton1_Click_1(null, null);
break;
case Keys.T:
tsUtility_Click(null, null);
break;
case Keys.K:
tsKawasaki_Click(null, null);
break;


}
base.WndProc(ref m);
}

private void RegHotKeys()
{
ghk.Register();
ghk1.Register();
ghk2.Register();
ghk3.Register();
ghk4.Register();
ghk5.Register();
ghk6.Register();
ghk7.Register();
ghk8.Register();
}

private void UnRegHotKeys()
{
ghk.Unregiser();
ghk1.Unregiser();
ghk2.Unregiser();
ghk3.Unregiser();
ghk4.Unregiser();
ghk5.Unregiser();
ghk6.Unregiser();
ghk7.Unregiser();
ghk8.Unregiser();
}


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

morteza271
شنبه 17 مهر 1389, 15:38 عصر
از DevComponent میتونی استفاده کنی...
توی این کامبوننت برای هر کلید یا چیز دیگه ای میتونی کلید میانبر تعریف کنی و دقیقا همون چیزی هست که شما میخواین.
آدرس دانلودشو ندارم وگرنه برات میذاشتم،شرمنده.:خجالت:
موفق باشید.

babak.h
شنبه 17 مهر 1389, 16:16 عصر
سلام مجدد

برای اینکه کد داخل رویداد کلیک یک دکمه را فراخوانی کنی از متد PerformClick استفاده کن.


button1.PerformClick();

به همین سادگی!


موفق باشید