none
глобальные "горячие" клавиши RRS feed

  • Вопрос

  • Всем здравствуйте! С новогодними праздниками вас!

    У меня воистину неновогодний вопрос =) Делаю програмульку, базирующуюся на глобальных хоткеях, собезъянничал пример в гугле, выкинул из него весь мусор и затесал под свои нужды. Вот что у меня получилось (Замысел реализован на на 2-х хоткеях, 1-й в AIMP'е, по нажатию копирует инфо о текущей композиции в буфер обмена, 2-й в моей проге, берет инфу из буфера, фильтрует, и создает поисковый запрос в гугле. Очень удобно и практично, т.к. я постоянно гоняю интернет радиостанции, и когда звучит что-нибудь приятное, 2 хоткея - и ты уже знакомишься с этой композицией "вплотную"). Так вот собственно рабочий код:

    using System;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication13
    {
      public partial class Form1 : Form
      {
        [DllImport("user32.dll")]
        private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);
        [DllImport("user32.dll")]
        private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
    
        public Form1()
        {
          InitializeComponent();
          RegisterHotKey(this.Handle, this.GetType().GetHashCode(), (uint)ModiferKeys.Alt, (uint)Keys.X);
        }
    
        protected override void WndProc(ref Message m)
        {
          if (m.Msg == 0x0312)
          {
            System.Diagnostics.Process.Start("http://www.google.ru/search?q=" + GetSong());
            notifyIcon1.BalloonTipText = "Ищем композицию \"" + GetSong() + "\"";
            notifyIcon1.ShowBalloonTip(3000);
          }
          base.WndProc(ref m);
        }
    
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
          UnregisterHotKey(this.Handle, this.GetType().GetHashCode());
        }
    
        private string GetSong()
        {
          string Clip = Clipboard.GetText();
          string[] Temp = Clip.Split(']');
          Clip = Temp[Temp.Length - 1];
          Temp = Clip.Split('<');
          Clip = Temp[0];
          Clip = Clip.Trim();
          return Clip;
        }
    
        [Flags]
        public enum ModiferKeys : uint
        {
          Alt = 1,
          Control = 2,
          Shift = 4,
          Win = 8
        }
      }
    }
    
    
    А вот и вопрос, я подумал что было-бы не плохо прикрутить сюда еще один хоткей, что-бы название песни копировать в мою БД. И не смог. Проблема в том что я в АПИ не силен, и не знаю как реализовать. Подскажите пожалуйста как сюда прикрутить произвольное количество хоткеев. Спасибо.

    6 января 2011 г. 12:22

Ответы

  • Второй параметр RegisterHotKey - это идентификатор. При нажатии хоткея приходит Message типа WM_HOTKEY (0x0312). Идентификатор хоткея передается в Message.WParam. Замени this.GetType().GetHashCode() осмысленным значением, разным для разных хоткеев.
    • Помечено в качестве ответа JusteG 9 января 2011 г. 9:39
    9 января 2011 г. 8:33

Все ответы