этот код регистрирует много горячих клавиш
, когда пользователь нажимает их ... эта программа связывает это, а затем повторно отправляет эту горячую клавишу для программ, которые хотят связать
(если есть другой способ, скажите мне, как)
давайте возьмем такой сценарий:
удерживайте пользователя клавишу 'shift' и нажмите '1' , когда он откроет блокнот
привязка моей программы что:
- незарегистрированная горячая клавиша
- отправить 'shift' + '1' для блокнота
- зарегистрируйте горячие клавиши
пользователь все еще удерживает клавишу «Shift» и нажимает «1»
здесь windows не отправляет мне эти клавиши, потому что клавиша «Shift» была удержана до регистрации (моя программа не регистрируется, а затем повторно регистрирует горячие клавиши)
, но если пользователь не удерживает клавишу 'shift' , нажмите 'shift' + '1' .... отлично работает
так как я могу решить эту проблему
[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);
private void Reg() //Reg all Hotkeys
{
int id = 0;
foreach (var item1 in Program.Allsh1)//contain 'alt' 'ctrl' 'shift'
foreach (var item2 in Program.Allsh2)//contain ather keys (F1 -> F9) and (1 ->8) for example
RegisterHotKey(this.Handle, id++, item1.Value, item2.Value);
}
private void UnReg() //unReg all Hotkeys
{
int i = Program.Allsh1.Count * Program.Allsh2.Count - 1;
while (i>=0)
{
UnregisterHotKey(this.Handle, i--);
}
}
protected override void WndProc(ref Message m)//hotkey bind pressed //windows callback
{
if (m.Msg != 0x0312)
goto Exit;
int id = m.WParam.ToInt32();
int sh1N = ((int)m.LParam & 0xFFFF);//return 1 for 'alt' ,2 for 'ctrl' or 4 for 'shift' otherwise -1
int sh2N = (((int)m.LParam >> 16) & 0xFFFF);
string sh1 = KeyConvert.ToName(sh1N);//return 'alt' or 'ctrl' or 'shift' otherwise null
string sh2 = KeyConvert.ToName(sh2N);//return key definition in hex for known keys otherwise null
if (sh1 == null || sh2 == null)
{
Debug.WriteLine(string.Format("error at figure key : {0} + {1}", sh1N.ToString(), sh2.ToString()));
goto Exit;
}
string tmp;
if (sh1N == 1)//alt
tmp = "%";
else if (sh1N == 2)//ctrl
tmp = "^";
else if (sh1N == 4)//shift
tmp = "+";
else goto Exit;
tmp = tmp + "({" + sh2 + "})";
UnReg();//unregister hot key
SendKeys.SendWait(tmp);//send same keys again for ( windows or active program)
Reg();//re register for hotkeys
Exit:
base.WndProc(ref m);
}
Я пытаюсь это сделать:
UnReg();//unregister hot key
SendKeys.SendWait(tmp);//send same keys again for ( windows or active program)
Reg();//re register for hotkeys
SendKeys.SendWait('shift up');
SendKeys.SendWait('shift down');
но windows не знал, что 'сдвиг вверх' и вниз
есть еще или способ к этому?