■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; } }
}
}
|
|