C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Win8でのキーボードフック


(過去ログ 108 を表示中)

[トピック内 1 記事 (1 - 1 表示)]  << 0 >>

■64442 / inTopicNo.1)  Win8でのキーボードフック
  
□投稿者/ まぐねしうむ (1回)-(2012/12/03(Mon) 17:06:07)

分類:[C#] 

環境:VS2005 C#2.0


お世話になります。
Windows8環境において、キーボードの[Winキー]のキー押下がキャンセルできずに困っております。
Windows8以外のOSでは正常に動作するのですが、Win8のみ押下のキャンセルができずに
「MetroUI?」メニュー?が表示されてしまい困っております。
Win8以外のOSではフックができており、スターとメニューを表示しなくなっています。

Win8では「スタートメニュー」の代わりに表示される「MetroUI?」が入ったのでOSの処理が変更されたのでは
ないかと考えておりますが、どなたか何か情報をお持ちの方はいらっしゃらないでしょうか?

ちなみに、タブレットPCの「田」ボタン(キーボードとは別のH/Wボタン)を押すと
キーボードの左側のWinキーと同じキーコードが表示されました。
(WINDOWSKEY1 = 91でした。)
よろしくお願いします。

◆参考にしたHP
http://azumaya.s101.xrea.com/wiki/index.php?%B3%D0%BD%F1%2FC%A2%F4%2F%A5%B0%A5%ED%A1%BC%A5%D0%A5%EB%A5%D5%A5%C3%A5%AF

◆書いたコード

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace test
{
    /// <summary>
    /// 特定のキー操作を禁止
    /// </summary>
    public static class NgKey
    {
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern int GetAsyncKeyState(long vkey);

        private const int WINDOWSKEY1 = 91;
        private const int WINDOWSKEY2 = 92;

        /// <summary>
        /// 特定のキーを無効化する
        /// </summary>
        public static void start()
        {
            KeybordCapture.KeyDown += new EventHandler<KeybordCapture.KeybordCaptureEventArgs>(KeybordCapture_KeyDown);
        }

        private static void KeybordCapture_KeyDown(object sender, KeybordCapture.KeybordCaptureEventArgs e)
        {
            //◆Windowsキー
            if ((e.KeyCode == WINDOWSKEY1) || (e.KeyCode == WINDOWSKEY2))
            {
                e.Cancel = true;
            }

            //LockならFormを上げて通知する?
            if (e.Cancel == true)
            {
                MessageBox.Show("押されたキー操作は禁止されています。"e.KeyCode.ToString());
                //Application.DoEvents();
            }

        }

    static class KeybordCapture
    {
        internal class Native
        {
            [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
            public struct KBDLLHOOKSTRUCT
            {
                public int vkCode;
                public int scanCode;
                public int flags;
                public int time;
                public IntPtr dwExtraInfo;
            }
            [System.Runtime.InteropServices.UnmanagedFunctionPointer(System.Runtime.InteropServices.CallingConvention.Cdecl)]
            public delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam);
            [System.Runtime.InteropServices.DllImport("kernel32.dll")]
            public static extern IntPtr GetModuleHandle(string lpModuleName);
            [System.Runtime.InteropServices.DllImport("user32.dll")]
            public static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, int dwThreadId);
            [System.Runtime.InteropServices.DllImport("user32.dll")]
            public static extern IntPtr CallNextHookEx(IntPtr hHook, int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam);
            [System.Runtime.InteropServices.DllImport("user32.dll")]
            public static extern bool UnhookWindowsHookEx(IntPtr hHook);

            public const int WH_KEYBOARD_LL = 13;
            public const int HC_ACTION = 0;
            public const int WM_KEYDOWN = 0x0100;
            public const int WM_KEYUP = 0x0101;
            public const int WM_SYSKEYDOWN = 0x0104;
            public const int WM_SYSKEYUP = 0x0105;
        }

        public sealed class KeybordCaptureEventArgs : EventArgs
        {
            private int m_keyCode;
            private int m_scanCode;
            private int m_flags;
            private int m_time;
            private bool m_cancel;

            internal KeybordCaptureEventArgs(Native.KBDLLHOOKSTRUCT keyData)
            {
                this.m_keyCode = keyData.vkCode;
                this.m_scanCode = keyData.scanCode;
                this.m_flags = keyData.flags;
                this.m_time = keyData.time;
                this.m_cancel = false;
            }

            public int KeyCode { get { return this.m_keyCode; } }
            public int ScanCode { get { return this.m_scanCode; } }
            public int Flags { get { return this.m_flags; } }
            public int Time { get { return this.m_time; } }
            public bool Cancel
            {
                set { this.m_cancel = value; }
                get { return this.m_cancel; }
            }
        }

        private static IntPtr s_hook;
        private static Native.LowLevelKeyboardProc s_proc;
        ////public static event EventHandler<KeybordCaptureEventArgs> SysKeyDown;
        //public static event EventHandler<KeybordCaptureEventArgs> SysKeyUp;
        public static event EventHandler<KeybordCaptureEventArgs> KeyDown;
        public static event EventHandler<KeybordCaptureEventArgs> KeyUp;
        static KeybordCapture()
        {
            s_hook = Native.SetWindowsHookEx(Native.WH_KEYBOARD_LL,
                s_proc = new Native.LowLevelKeyboardProc(LowLevelKeyboardProc),
                System.Runtime.InteropServices.Marshal.GetHINSTANCE(typeof(KeybordCapture).Module),
                //Native.GetModuleHandle(null),
                0);
            AppDomain.CurrentDomain.DomainUnload += delegate
            {
                if (s_hook != IntPtr.Zero)
                    Native.UnhookWindowsHookEx(s_hook);
            };
        }

        static IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, ref Native.KBDLLHOOKSTRUCT lParam)
        {
            bool cancel = false;
            if (nCode == Native.HC_ACTION)
            {
                KeybordCaptureEventArgs e = new KeybordCaptureEventArgs(lParam);

                
                if ((wParam.ToInt32() == Native.WM_KEYDOWN) ||
                    (wParam.ToInt32() == Native.WM_SYSKEYDOWN))
                {
                    if (KeyDown != null) KeyDown(null, e);
                }
                else if ((wParam.ToInt32() == Native.WM_KEYUP) ||
                    (wParam.ToInt32() == Native.WM_SYSKEYUP))
                {
                    if (KeyUp != null) KeyUp(null, e);
                }

                cancel = e.Cancel;
            }
            return cancel ? (IntPtr)1 : Native.CallNextHookEx(s_hook, nCode, wParam, ref lParam);
        }

        public static bool IsCapture { get { return s_hook != IntPtr.Zero; } }
    }
}

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -