Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Прехват нажатия клавишь


Автор: Dimyan 28.2.2004, 14:30
Как мне перехватить нажатие какой либо клавиши моей программкой если она сидит свернутая в трее?

Автор: shedon 28.2.2004, 16:17
Поставить хук на клаву.

Автор: Dimyan 1.3.2004, 07:16
а можно поставить хук средствами C#?

Автор: IZ@TOP 3.3.2004, 13:00
А что такое "ХУК" confused.gif

Автор: Dimyan 3.3.2004, 13:18
хук(в краце) - перехват системных сообщений

Автор: Dimyan 8.3.2004, 08:56
Хочу поделится найденым ответом
Для глобального системного хука клавиатуры (т.к. мне было нужно именно перехват нажатия клавишь клавиатуры) можно использовать функцию WinAPI - RegisterHotKey, а вот пример подсказанного мне способа использования этой функции:
Код
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

 

public class WindowsForm : System.Windows.Forms.Form
{
[DllImport("USER32.DLL", EntryPoint="RegisterHotKey")]
public static extern bool HotK(int hWnd, int id, uint fsModifiers, uint vk);
public static int pressCnt;
const int MOD_CONTROL = 2;
const int MOD_ALT = 1;
const int WM_HOTKEY = 0x312;
const int VK_F2 = 0x71;
 
[STAThread]
public static void Main()
{
 Application.Run(new WindowsForm());
}

public WindowsForm()
{
 this.Size = new Size(500, 50);
 if( !HotK(this.Handle.ToInt32(), 1, MOD_CONTROL+MOD_ALT, VK_F2) )
  throw( new ArgumentException("Can't install hot key! Bad arguments?"));

}

protected override void WndProc(ref Message m)
   {
       switch (m.Msg)
       {
           case WM_HOTKEY:
  this.Text = "HotKey was pessed "+(++pressCnt).ToString()+" times."+
    "Lparam="+m.LParam.ToInt32().ToString("X")+";Wparam="+m.WParam.ToInt32().ToString("X");
        break;                
 }
       base.WndProc(ref m);
}
}

Так, что пользуйтесь ребятки, думаю не у меня одного на этом форуме возникали подобные вопросы

Автор: zmejg 3.8.2007, 18:22
столкнулся с той же проблемой.

все работает, но есть только одна проблемка - мой обработчик работает, стандартная обработка нажатия клавиши  не происходит . кто может подсказать что нужно делать?

Автор: zmejg 10.10.2007, 15:03
Так что, никто не знает?
...очень нужно

Добавлено через 1 минуту и 33 секунды
вызываю две процедуры base.WndProc и base.DefWindowProc, думал это поможет, но результата никакого

Автор: nettitan 13.3.2008, 10:41
а как этот хук использовать подскажите плиз.....
например мне нада перехватить нажатие Ctrl+С из другой программы  smile 

Автор: zaver 13.3.2008, 13:37
эта тема уже была.
вот ссылка на мега-супер-пупер-папский хук
http://forum.vingrad.ru/forum/topic-188315.html

Автор: nettitan 13.3.2008, 19:23
Оке  smile 
посмотрим что за адски-супер-дупер-пупер и все в єтом роде ХУК  smile 
О результатах сообщю, щас будем шаманить  smile 

Автор: nettitan 15.3.2008, 11:33
Да !!! таки фунциклирует  smile 
Могу сказать только БОЛЬШОЕ СПАСИБО !!!!

Автор: starostin 27.12.2010, 22:35
Объясните мне тупом, что за Dispose в дизайнере форма1.цс? Что она делать должна и почему компилятор говорит что для неё нет соответствующего переопределения? 

Автор: CYBERDREAM 28.12.2010, 08:36
starostin, ты темой не ошибся?

Автор: starostin 28.12.2010, 09:57
может и ошибъся, просто вытекает эта ошибка из этого примера. Создаю проект, вставляю этот код 
Цитата
Код


using System; 
using System.Collections; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 
  
public class WindowsForm : System.Windows.Forms.Form 

 [DllImport("USER32.DLL", EntryPoint="RegisterHotKey")] 
 public static extern bool HotK(int hWnd, int id, uint fsModifiers, uint vk); 
 public static int pressCnt; 
 const int MOD_CONTROL = 2; 
 const int MOD_ALT = 1; 
 const int WM_HOTKEY = 0x312; 
 const int VK_F2 = 0x71; 
  
 [STAThread] 
 public static void Main() 
 { 
  Application.Run(new WindowsForm()); 
 } 
 public WindowsForm() 
 { 
  this.Size = new Size(500, 50); 
  if( !HotK(this.Handle.ToInt32(), 1, MOD_CONTROL+MOD_ALT, VK_F2) ) 
   throw( new ArgumentException("Can't install hot key! Bad arguments?")); 
 } 
 protected override void WndProc(ref Message m) 
    { 
        switch (m.Msg) 
        { 
            case WM_HOTKEY: 
   this.Text = "HotKey was pessed "+(++pressCnt).ToString()+" times."+ 
     "Lparam="+m.LParam.ToInt32().ToString("X")+";Wparam="+m.WParam.ToInt32().ToString("X"); 
         break;                
  } 
        base.WndProc(ref m); 
 } 
}



и появляеться ошибка, что Dispose не имеет подходящих переопределений в Designer.Form1.cs

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)