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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

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

Простите за дублирование темы, просто первый раз запостил ее не в ту тему.

Вот пример кода перехвата и последующего блокирования комбинации клавиш 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 вне форума Ответить с цитированием
Старый 12.12.2014, 13:56   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Что ж вы строите предположение, лепите свои мысли и домыслы, вместо того, чтобы просто прочитать доки?

Цитата:
khs.VirtualKeyCode - сравнивается походу с Tab (ее виртуальный код 9 соответственно)
Цитата:
vkCode
Type: DWORD
A virtual-key code. The code must be a value in the range 1 to 254.
Цитата:
VK_TAB
0x09
TAB key
Цитата:
wParam.ToInt32() - наверно проверяет нажата ли какая нибудь клавиша,
Цитата:
wParam [in]
Type: WPARAM
The identifier of the keyboard message. This parameter can be one of the following messages: WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, or WM_SYSKEYUP.
Цитата:
а вот с чем сравнивается khs.ScanCode я не знаю
Цитата:
scanCode
Type: DWORD
A hardware scan code for the key.
p51x вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться в коде fate Общие вопросы по Java, Java SE, Kotlin 5 17.03.2009 22:10
ПОмогите разобраться в коде программы на С++ Ajanami Помощь студентам 4 26.11.2008 15:24