Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2012, 23:16   #1
AntyDES
Пользователь
 
Регистрация: 07.04.2011
Сообщений: 19
Вопрос обработка клавиш из dll

На работе пишу дополнение в виде dll к одной программе.
В dll создаю класс, который автоматически загружается в программе.

смысл класса, реализовать горячие клавиши.

сначала хотел реализовать через keyeventhandler, но чтобы осуществить эту реализацию, необходим контрол или форма. у меня этого дела нет, а следовательно данная реализация мне не подходит. что очень огорчает, так как реализация именно через keyeventhandler мне подошла бы больше всего.
вопрос к знатокам, как без формы / контрола применить в пустом классе обработчик keyeventhandler ?


в связи с этой проблемой, решил перехватывать сообщения.
регистрирую в системе через registerhotkey сочетание клавиш, потом отлавливаю это сообщение посредством application.addmessagefilter. там я проверяю, если активное окно - моя программа, запускаю выполнение кода.
но проблема в том, что мои горячие клавиши съедают обработку горячих клавиш других приложений. например, если горячая клавиша CTRL + F, то в нотепаде, браузере и т.д. эти сочетания не обрабатываются. они приходят в мой код, а после чего не передаются далее "по цепочке" к своему отладчику.

прошу помочь мне преодолеть эти трудности, сроки поджимают, а универсального решения нет
AntyDES вне форума Ответить с цитированием
Старый 22.10.2012, 23:36   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Так вы наверное глушите их, надо отдать дальше системе.
Код показывайте.
eval вне форума Ответить с цитированием
Старый 23.10.2012, 00:00   #3
AntyDES
Пользователь
 
Регистрация: 07.04.2011
Сообщений: 19
По умолчанию

код на работе. в принципе, я красочно все описал. по памяти, в кратце код такой:

Код:

класс
{

  [DllImport("user32.dll")]
  public static extern int RegisterHotKey(IntPtr hwnd, int id, int fsModifiers, int vk);
  [DllImport("user32.dll")]
  static extern bool UnregisterHotKey(IntPtr hWnd, int id);

  private const int MOD_ALT = 0x1;
  private const int MOD_CONTROL = 0x2;
  private const int MOD_SHIFT = 0x4;
  private const int MOD_WIN = 0x8;
  private const int WM_HOTKEY = 0x312;

  
конструктор
{

  // Например хоткей CTRL+F
  RegisterHotKey(null, 1, MOD_CONTROL, (int)Keys.F);

}  
  
  
функция отлова сообщений (ref Message m)
{

  if( m.Msg == WM_HOTKEY )
  {
    if( (int)m.WParam == 1 )
    {
      if(имя_программы = "моя программа")
      {
        выполнить_код;
        return true;
      }
    }
  }

  return true;
  // далее, команда CTRL+F теряется 
  
}

}
AntyDES вне форума Ответить с цитированием
Старый 23.10.2012, 10:00   #4
AntyDES
Пользователь
 
Регистрация: 07.04.2011
Сообщений: 19
По умолчанию

более точный код.
необходимо, чтобы нажатые клавиши, после обработки, переходили в следующий обработчик.

Код:
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.ComponentModel;


namespace HotKey
{

  public class HotKeyAddin
  {

    [DllImport("User32.dll", SetLastError = true)]
    public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);

    [DllImport("User32.dll", SetLastError = true)]
    public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

    
    public HotKeyAddin()
    {

      if (!RegisterHotKey(IntPtr.Zero, 1, 2 /* ctrl */, (int)Keys.F))
        throw new Win32Exception(Marshal.GetLastWin32Error());

      if (!RegisterHotKey(IntPtr.Zero, 2, 6 /* ctrl + shift */, (int)Keys.F))
        throw new Win32Exception(Marshal.GetLastWin32Error());
    
      Application.AddMessageFilter(new KeyMessageFilter());

    }

}

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.ComponentModel;


namespace HotKey
{

  public class KeyMessageFilter : IMessageFilter
  {

    public bool PreFilterMessage(ref Message m)
    {

      if (m.Msg == 0x0312) // hot key message
      {

        if ((int)m.WParam == 1)
        {
          MessageBox.Show("Сработала обработка горячей клавиши #1");
          return false;
        }
        else
        {
          MessageBox.Show("Сработала обработка горячей клавиши #2");
          return true;
        }

      }
      
      return false;

    }

  }

}
AntyDES вне форума Ответить с цитированием
Старый 23.10.2012, 11:03   #5
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Почему return true ?
eval вне форума Ответить с цитированием
Старый 23.10.2012, 12:42   #6
AntyDES
Пользователь
 
Регистрация: 07.04.2011
Сообщений: 19
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
Почему return true ?
потому что пробывал разные способы, что сработало. ни один не работает.

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

моя dll, чисто по сути, должна внутри программы обрабатывать нажатия клавиш. мне вовсе не обязательно, чтобы они работали за ее пределами. а так как единственный выход который я нашел - это регистрация хоткеев и отлов их, то мне нужно знать как передать комбинацию клавиш дальше, другим программам, типа блокнот, браузер, или что у нас сейчас активно. return false не делает того, что я желаю.
AntyDES вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обработка нажатий клавиш в Qt SiNoNoto Gamedev - cоздание игр: Unity, OpenGL, DirectX 9 28.06.2017 16:42
Обработка нажатия клавиш в цикле mLight Общие вопросы Delphi 4 05.11.2011 19:03
Обработка клавиш на TListBox Melanholly Общие вопросы Delphi 2 31.10.2011 14:06
Обработка исключения из DLL libmysql.dll san4ezart Помощь студентам 2 28.08.2011 22:39
обработка нажатия клавиш VC++ консоль rest Помощь студентам 0 06.10.2009 07:53