Глобальные горячие клавиши C# не будут работать при первом сворачивании в трей, но после повторного показа и сворачивания все работает
Извините, если я что-то упустил, как дурак, но я должен отправить в этом проекте, и у меня есть вопрос
Я зарегистрировал глобальные горячие клавиши на созданной ручке (РЕДАКТИРОВАТЬ!!)
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
RegisterHotKey(this.Handle, 1, 0x0000,0x70);
RegisterHotKey(this.Handle, 2, 0x0000,0x71);
RegisterHotKey(this.Handle, 3, 0x0000,0x72);
RegisterHotKey(this.Handle, 4, 0x0000,0x73);
RegisterHotKey(this.Handle, 5, 0x0000,0x74);
RegisterHotKey(this.Handle, 6, 0x0000,0x75);
RegisterHotKey(this.Handle, 7, 0x0000,0x76);
RegisterHotKey(this.Handle, 8, 0x0000,0x77);
RegisterHotKey(this.Handle, 9, 0x0000,0x78);
RegisterHotKey(this.Handle, 10, 0x0000,0x79);
RegisterHotKey(this.Handle, 11, 0x0000,0x7A);
RegisterHotKey(this.Handle, 12, 0x0000,0x7B);
RegisterHotKey(this.Handle, 13, 0x0002,0x45);
}
и мой button1 действительно скрывает форму и делает трайкон видимым
void Button1Click(object sender, EventArgs e)
{
trayicon.Visible=true;
ShowInTaskbar=false;
this.Hide();
trayicon.ShowBalloonTip(2000,"Corrector is now minimized","Right click at check symbol to Exit or show and change hotkey",ToolTipIcon.Info);
}
У меня также есть функция, чтобы показать форму после двойного щелчка на значке в трее
private void trayicon_DoubleClick(object Sender, EventArgs e)
{
this.Show();
Visible=true;
ShowInTaskbar=true;
}
Теперь проблема, я установил глобальную горячую клавишу 13 для выхода из программы.
1.Я открыл программу, нажал Ctrl+E (горячая клавиша) >>> Она выходит из программы
2. Я открыл программу, нажмите кнопку 1, затем Ctrl+E>>> Она не выходит из программы
3. Я открыл программу, нажмите кнопку 1 и дважды щелкните значок, форма покажет, затем Ctrl+E>>>> Это действительно закроет программу
4. Я открыл программу, нажмите кнопку 1 и дважды щелкните значок, форма отобразится, затем снова нажмите кнопку 1, форма исчезла, а затем Ctrl+E>>> ВЫХОДИТ ИЗ ПРОГРАММЫ.
Вот почему я запутался, 2 и 4 должны иметь одинаковый результат, но на 4 это работает, а на 2 это не работает
Кто-нибудь, пожалуйста, помогите мне
Спасибо
Пум
Редактировать:!!
Мой Wndproc
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0312)
{
int id = m.WParam.ToInt32();
if(id==14)
{
Application.Exit();
}
if(id==13)
{
Application.Exit();
}
if(check2==0)
{
this.TopMost=true;
MessageBox.Show("กรุณาเลือกปุ่มที่จะใช้เเก้ก่อน,Select hotkey first","ข้อผิดพลาด",MessageBoxButtons.OK,MessageBoxIcon.Error);
this.TopMost=false;
}
if(id==check2)
{
translate();//You can replace this statement with your desired response to the Hotkey.
}
}
base.WndProc(ref m);
}
1 ответ
Уверен, что ваша проблема связана с постоянным переключением ShowInTaskbar
имущество. Насколько мне известно, это разрушает и воссоздает ваше окно, а это означает, что ручка, с которой вы зарегистрировали свои горячие клавиши, теперь указывает на неправильную вещь.
Поскольку ваш код не изменен, горячие клавиши назначаются только тогда, когда ваша форма создается ПЕРВЫМ, так как вызов Hide()
не располагает окном (для записи, Visible
звонки избыточны; Show()/Hide() эквивалентно переключению Visible
истинно / ложно).
Насколько я знаю, есть два пути решения этой проблемы. Либо назначьте свои горячие клавиши после переключения на ShowInTaskbar
свойство или переопределить OnHandleCreated
метод вашей формы и сделать ваше назначение там.
Я не понимаю, почему ваши шаги 3 и 4 работают так, как они работают; Я думаю, они оба не должны выходить из программы. Надежно ли это происходит? Возможно, кто-то умнее может рискнуть предположить, почему это работает. Возможно ли, что ручка перерабатывается?
Я исследовал проблему немного дальше (была та же проблема) и увидел, что дескриптор окна уничтожается сразу после того, как вы отправляете приложение в лоток, а затем сразу же восстанавливается дескриптор окна, когда я был отправлен в лоток:
OnHandleDestroyed(EventArgs e)
призванныйOnHandleCreated(EventArgs e)
сразу после этого вызывается
Просто перерегистрируйте свои горячие клавиши в обратном вызове OnHandleCreated, и ваши горячие клавиши будут работать после этого всякий раз, когда вы отправляете свое приложение в лоток.
PS: когда вы просто сворачиваете панель задач, ваши горячие клавиши всегда будут работать.
С уважением