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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2014, 00:56   #1
p0keT
Пользователь
 
Регистрация: 09.10.2014
Сообщений: 13
По умолчанию Перехват нажатий клавиш клавиатуры (hook), помощь с разбором части кода

Вот пример кода перехвата и последующего блокирования комбинации клавиш Alt+Tab
Код:
namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
       
            private const int WH_KEYBOARD_LL = 13;
            private LowLevelKeyboardProcDelegate m_callback;
            private IntPtr m_hHook;
 
            [DllImport("user32.dll", SetLastError = true)]
            private static extern IntPtr SetWindowsHookEx(
                int idHook,
                LowLevelKeyboardProcDelegate lpfn,
                IntPtr hMod, int dwThreadId);
 
            [DllImport("user32.dll", SetLastError = true)]
            private static extern bool UnhookWindowsHookEx(IntPtr hhk);
 
            [DllImport("Kernel32.dll", SetLastError = true)]
            private static extern IntPtr GetModuleHandle(IntPtr lpModuleName);
 
            [DllImport("user32.dll", SetLastError = true)]
            private static extern IntPtr CallNextHookEx(
                IntPtr hhk,
                int nCode, IntPtr wParam, IntPtr lParam);
 
 
 
            private IntPtr LowLevelKeyboardHookProc(
                int nCode, IntPtr wParam, IntPtr lParam)
 
            {
                if (nCode < 0)
                {
                    return CallNextHookEx(m_hHook, nCode, wParam, lParam);
                }
                else
                {
                    var khs = (KeyboardHookStruct)
                              Marshal.PtrToStructure(lParam,
                              typeof(KeyboardHookStruct));
 
                    if (khs.VirtualKeyCode == 9 &&
                        wParam.ToInt32() == 260 &&
                        khs.ScanCode == 15) //alt+tab 
                    {
                        IntPtr val = new IntPtr(1);
                        return val;
                    }
 
                    else
                    {
                        return CallNextHookEx(m_hHook, nCode, wParam, lParam);
                    }
 
                }
            }
            [StructLayout(LayoutKind.Sequential)]
            private struct KeyboardHookStruct
            {
                public readonly int VirtualKeyCode;
                public readonly int ScanCode;
                public readonly int Flags;
                public readonly int Time;
                public readonly IntPtr ExtraInfo;
 
            }
            private delegate IntPtr LowLevelKeyboardProcDelegate(
                int nCode, IntPtr wParam, IntPtr lParam);
 
            public void SetHook()
            {
                m_callback = LowLevelKeyboardHookProc;
                m_hHook = SetWindowsHookEx(WH_KEYBOARD_LL,
                    m_callback,
                    GetModuleHandle(IntPtr.Zero), 0);
            }
 
            public void Unhook()
            {
                UnhookWindowsHookEx(m_hHook);
            }
 
        
        private void button1_Click(object sender, EventArgs e)
        {
 
            SetHook();
            button1.Enabled = false;
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            Unhook();
            button1.Enabled = true;
        }
 
       
    }
  
}
Вопрос: как изменить прогу так, что бы она блокировала другую комбинацию (например Alt+F4)?
Я знаю что проверка происходит здесь:

Код:
{
                    var khs = (KeyboardHookStruct)
                              Marshal.PtrToStructure(lParam,
                              typeof(KeyboardHookStruct));
 
                    if (khs.VirtualKeyCode == 9 &&
                        wParam.ToInt32() == 260 &&
                        khs.ScanCode == 15) //alt+tab 
                    {
                        IntPtr val = new IntPtr(1);
                        return val;
                    }
khs.VirtualKeyCode - сравнивается походу с Tab (ее виртуальный код 9 соответственно)
wParam.ToInt32() - наверно проверяет нажата ли какая нибудь клавиша,
а вот с чем сравнивается khs.ScanCode я не знаю. По идее сравнение должно происходить с Alt, но код клавиши альт другой. И вообще я не нашел никакой клавиши с кодом 15.
Помогите разобраться с этим плз.
p0keT вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват нажатий клавиш клавиатуры Dj_SheLL Общие вопросы Delphi 7 21.10.2014 10:41
Проблема с разбором кода RedDevils7 Общие вопросы C/C++ 0 12.01.2013 21:19
Перехват нажатий клавиш и изменение кода клавиши an1s1 Win Api 1 22.09.2012 21:27
Перехват нажатий клавиш - АLT chandrasecar Win Api 8 27.11.2008 16:12
Иммитация нажатий клавиш клавиатуры chandrasecar Win Api 5 11.10.2008 12:16