Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hotkey - в процессе работы программы, Пауза или стоп 
:(
    Опции темы
theHelg
Дата 21.10.2009, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 23.6.2009

Репутация: нет
Всего: нет



У меня есть программа, которая что-то делает там себе...
Мне нужно прикрутить горячие клавиши, чтобы можно было запаузить выполнение программы, ну или там остановить выполнение текущего действия.

Используя RegisterHotKey я смогу найти такое сообщение.

Но, во-первых, так как все прикрученно на форму - в теории (так как еще не прикрутил) не уверен, что во время нирваны (то есть во время действий - форма задумчивая - то есть ен реагирует на внешние раздражители), будет отрабатывать мой код. Если будет - то экспериментально я это пойму. Но вот если нет- то даже и не знаю, как можно будет обойти эту проблему... DoEvents - вроде как будет некошерно вызывать...

И самый интересный вопрос - как мне поставить на паузу выполнение программы?
Мне приходит в голову, только такой способ, завести статичную/паблик переменную, куда ставить флаг пауза/не пауза.
И в ключевые точки программы поставить проверки на выход/паузу...

Пытаюсь мысленно представить, что может быть можно сделать кукую-то функцию, которая будет тормозить весь процесс, но реализация для меня неясна...

PM MAIL   Вверх
theHelg
Дата 23.10.2009, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 23.6.2009

Репутация: нет
Всего: нет



Добрый день!

вот тут есть кусок кода, чтобы регистрировать глобальные горячиек кнопки и следить за ними.

У меня такой вопрос, как минимально изменить код, чтобы можно было привязывать разные комбинации?

То есть ctrl-f5 - OnHotKeyPressed1, а при ctrl+f6 - OnHotKeyPressed1?


Код

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.ComponentModel;
//Форма, демонстрирующая работу Hot Keys
class DemoForm: Form
{
  const ModifierKey MODIFIERS1 = ModifierKey.MOD_CONTROL;
  const Keys VIRTUAL_KEY1 = Keys.F5;
  const ModifierKey MODIFIERS1 = ModifierKey.MOD_CONTROL;
  const Keys VIRTUAL_KEY1 = Keys.F6;
  Button btStart = new Button();
  Button btStop = new Button();
  public DemoForm()
  {
    //Кнопка для решистрации HotKey
    btStart.Click += new EventHandler(btStart_Click);
    btStart.Text = "Start";
    //Кнопка для отмены регистрации HotKey
    btStop.Click += new EventHandler(btStop_Click);
    btStop.Text = "Stop";
    btStop.Left = btStart.Right;
    btStop.Enabled = false;
    Controls.AddRange(new Control[]{btStart, btStop});
    HotKeyHelper.Instance.HotKeyPressed += new EventHandler(OnHotKeyPressed);
  }
  void btStart_Click(object sender, EventArgs e)
  {
    HotKeyHelper.Instance.Register(MODIFIERS, VIRTUAL_KEY);
    ToggleButtons();
  }
  void btStop_Click(object sender, EventArgs e)
  {
    HotKeyHelper.Instance.UnRegister();
    ToggleButtons();
  }
  //Меняет доступность кнопок на противоположное состояние
  void ToggleButtons()
  {
    btStart.Enabled = !btStart.Enabled;
    btStop.Enabled = !btStop.Enabled;
  }
  
  void OnHotKeyPressed1(object sender, EventArgs e)
  {
    MessageBox.Show("Hot key");
  }
  
  void OnHotKeyPressed2(object sender, EventArgs e)
  {
    MessageBox.Show("Hot key");
  }
  static void Main()
  {
    Application.Run(new DemoForm());
  }
}
public enum ModifierKey:uint
{
  MOD_ALT = 0x0001,
  MOD_CONTROL = 0x0002,
  MOD_SHIFT = 0x0004,
  MOD_WIN = 0x0008,
}
public sealed class HotKeyHelper: IMessageFilter
{
  const string MSG_REGISTERED = "Горячие клавиши уже зарегистрированы, вызовите UnRegister для отмены регистрации.";
  const string MSG_UNREGISTERED = "Горячие клавиши не зарегистрированы, вызовите Register для регистрации.";
  //Делаем из нашего класса singleton
  private HotKeyHelper()
  {
  }
  public static readonly HotKeyHelper Instance = new HotKeyHelper();
  bool isRegistered;
  ushort atom;
  ModifierKey modifiers;
  Keys keyCode;
  public void Register(ModifierKey modifiers, Keys keyCode)
  {
    //Эти значения нам будут нужны в PreFilterMessage
    this.modifiers = modifiers;
    this.keyCode = keyCode;
    //Не выполнена ли уже регистрация?
    if (isRegistered)
      throw new InvalidOperationException(MSG_REGISTERED);
    //Сохраняем atom, для последующей отмены регистрации
    atom = GlobalAddAtom(Guid.NewGuid().ToString());
    if (atom == 0)
      ThrowWin32Exception();
    if (!RegisterHotKey(IntPtr.Zero, atom, modifiers, keyCode))
      ThrowWin32Exception();
    //Добавляем себя в цепочку фильтров сообщений
    Application.AddMessageFilter(this);
    isRegistered = true;
  }
  public void UnRegister()
  {
    //Не отменена ли уже регистрация?
    if (!isRegistered)
      throw new InvalidOperationException(MSG_UNREGISTERED);
    if (!UnregisterHotKey(IntPtr.Zero, atom))
      ThrowWin32Exception();
    GlobalDeleteAtom(atom);
    //Удаляем себя из цепочки фильтров сообщений
    Application.RemoveMessageFilter(this);
    isRegistered = false;
  }
  //Генерирует Win32Exception в ответ на неудачный вызов импортируемой Win32 функции
  void ThrowWin32Exception()
  {
    throw new Win32Exception(Marshal.GetLastWin32Error());
  }
  //Событие, инициируемое при обнаружении нажатия HotKeys
  public event EventHandler HotKeyPressed;
  public bool PreFilterMessage(ref Message m)
  {
    //Проверка на сообщение WM_HOTKEY
    if (m.Msg == WM_HOTKEY && 
      //Проверка на окно
      m.HWnd == IntPtr.Zero &&
      //Проверка virtual key code
      m.LParam.ToInt32() >> 16 == (int)keyCode &&
      //Проверка кнопок модификаторов
      (m.LParam.ToInt32() & 0x0000FFFF) == (int)modifiers &&
      //Проверка на наличие подписчиков сообщения
      HotKeyPressed != null)
    {
      HotKeyPressed(this, EventArgs.Empty);
    }
    return false;
  }
  //Необходимые Win32 константы и функции
  const string USER32_DLL = "User32.dll";
  const string KERNEL32_DLL = "Kernel32.dll";
  const int WM_HOTKEY = 0x0312;
  [DllImport(USER32_DLL, SetLastError = true)]
  static extern bool RegisterHotKey(IntPtr hWnd, int id, ModifierKey fsModifiers, Keys vk);
  [DllImport(USER32_DLL, SetLastError = true)]
  static extern bool UnregisterHotKey(IntPtr hWnd, int id);
  [DllImport(KERNEL32_DLL, SetLastError = true)]
  static extern ushort GlobalAddAtom(string lpString);
  [DllImport(KERNEL32_DLL)]
  static extern ushort GlobalDeleteAtom(ushort nAtom);
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0543 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.