在.NET应用程序中禁用可访问性快捷方式?

此MSDN文章 – http://msdn.microsoft.com/en-us/library/bb219746(VS.85).aspx#Disabling_Accessibility_Shortcut_Keys – 为C ++程序员提供有关如何暂时禁用可访问性的Windows快捷方式的信息(例如按住Shift 8秒,或者连续按下Shift 5次以上)。

当然,在C#中有一些简单的方法可以做到这一点,但我找不到任何资源。 我在非全屏应用程序中使用DirectInput。

我想要做的就是没有恼人的popup窗口出现; 尽pipe如此,为了防止应用程序以非优雅的方式closures(我不希望在这种情况下永久性地改变用户的设置),我宁愿select一些不需要使用Windows设置的东西, 。

有什么想法吗?

Solutions Collecting From Web of "在.NET应用程序中禁用可访问性快捷方式?"

你将不得不做同样的事情在你参考的链接中完成。 SystemParametersInfo API函数可以通过P / Invoke层调用,你可以在这里找到定义:

http://www.pinvoke.net/default.aspx/user32/SystemParametersInfo.html

以防其他人需要这个,这里是转换的C#代码,最终确实工作:

[DllImport( "user32.dll", EntryPoint = "SystemParametersInfo", SetLastError = false )] private static extern bool SystemParametersInfo( uint action, uint param, ref SKEY vparam, uint init ); [DllImport( "user32.dll", EntryPoint = "SystemParametersInfo", SetLastError = false )] private static extern bool SystemParametersInfo( uint action, uint param, ref FILTERKEY vparam, uint init ); private const uint SPI_GETFILTERKEYS = 0x0032; private const uint SPI_SETFILTERKEYS = 0x0033; private const uint SPI_GETTOGGLEKEYS = 0x0034; private const uint SPI_SETTOGGLEKEYS = 0x0035; private const uint SPI_GETSTICKYKEYS = 0x003A; private const uint SPI_SETSTICKYKEYS = 0x003B; private static bool StartupAccessibilitySet = false; private static SKEY StartupStickyKeys; private static SKEY StartupToggleKeys; private static FILTERKEY StartupFilterKeys; private const uint SKF_STICKYKEYSON = 0x00000001; private const uint TKF_TOGGLEKEYSON = 0x00000001; private const uint SKF_CONFIRMHOTKEY = 0x00000008; private const uint SKF_HOTKEYACTIVE = 0x00000004; private const uint TKF_CONFIRMHOTKEY = 0x00000008; private const uint TKF_HOTKEYACTIVE = 0x00000004; private const uint FKF_CONFIRMHOTKEY = 0x00000008; private const uint FKF_HOTKEYACTIVE = 0x00000004; [StructLayout( LayoutKind.Sequential, CharSet = CharSet.Auto )] public struct SKEY { public uint cbSize; public uint dwFlags; } [StructLayout( LayoutKind.Sequential, CharSet = CharSet.Auto )] public struct FILTERKEY { public uint cbSize; public uint dwFlags; public uint iWaitMSec; public uint iDelayMSec; public uint iRepeatMSec; public uint iBounceMSec; } private static uint SKEYSize = sizeof( uint ) * 2; private static uint FKEYSize = sizeof( uint ) * 6; public static void ToggleAccessibilityShortcutKeys( bool ReturnToStarting ) { if ( !StartupAccessibilitySet ) { StartupStickyKeys.cbSize = Configuration.SKEYSize; StartupToggleKeys.cbSize = Configuration.SKEYSize; StartupFilterKeys.cbSize = Configuration.FKEYSize; SystemParametersInfo( SPI_GETSTICKYKEYS, SKEYSize, ref StartupStickyKeys, 0 ); SystemParametersInfo( SPI_GETTOGGLEKEYS, SKEYSize, ref StartupToggleKeys, 0 ); SystemParametersInfo( SPI_GETFILTERKEYS, FKEYSize, ref StartupFilterKeys, 0 ); StartupAccessibilitySet = true; } if ( ReturnToStarting ) { // Restore StickyKeys/etc to original state and enable Windows key SystemParametersInfo( SPI_SETSTICKYKEYS, SKEYSize, ref StartupStickyKeys, 0 ); SystemParametersInfo( SPI_SETTOGGLEKEYS, SKEYSize, ref StartupToggleKeys, 0 ); SystemParametersInfo( SPI_SETFILTERKEYS, FKEYSize, ref StartupFilterKeys, 0 ); } else { // Disable StickyKeys/etc shortcuts but if the accessibility feature is on, // then leave the settings alone as its probably being usefully used SKEY skOff = StartupStickyKeys; //if ( ( skOff & SKF_STICKYKEYSON ) == 0 ) { // Disable the hotkey and the confirmation skOff.dwFlags &= ~SKF_HOTKEYACTIVE; skOff.dwFlags &= ~SKF_CONFIRMHOTKEY; SystemParametersInfo( SPI_SETSTICKYKEYS, SKEYSize, ref skOff, 0 ); } SKEY tkOff = StartupToggleKeys; //if ( ( tkOff & TKF_TOGGLEKEYSON ) == 0 ) { // Disable the hotkey and the confirmation tkOff.dwFlags &= ~TKF_HOTKEYACTIVE; tkOff.dwFlags &= ~TKF_CONFIRMHOTKEY; rs = SystemParametersInfo( SPI_SETTOGGLEKEYS, SKEYSize, ref tkOff, 0 ); } FILTERKEY fkOff = StartupFilterKeys; //if ( ( fkOff & FKF_FILTERKEYSON ) == 0 ) { // Disable the hotkey and the confirmation fkOff.dwFlags &= ~FKF_HOTKEYACTIVE; fkOff.dwFlags &= ~FKF_CONFIRMHOTKEY; SystemParametersInfo( SPI_SETFILTERKEYS, FKEYSize, ref fkOff, 0 ); } } } 

请注意,我无法将三个来自C ++的IF语句(这些语句被注释掉)。 微软建议这些,但我不知道一种方法,使他们在C#中工作。 另外,我没有在结构体上使用sizeof()(而是手动为它们的大小创建变量),因为这样做需要不安全的代码,我不希望这是我的特定程序的要求。

感谢球员在我的XNA游戏中有一些小的完成,以防止粘滞键弹出。

这是完成的代码:

 using System; using System.Diagnostics; using System.Collections.Generic; using Microsoft.Xna.Framework; using System.Runtime.InteropServices; namespace Engine { #if WINDOWS /// <summary> /// Helper for Windows to temporarily disable the popup caused by the /// Accessibility features. /// See: http://stackoverflow.com/questions/734618/disabling-accessibility-shortcuts-in-net-application /// and: http://msdn.microsoft.com/en-us/library/ee416808(v=vs.85).aspx /// </summary> public class WindowsHelperAccessibilityKeys { [DllImport("user32.dll", EntryPoint = "SystemParametersInfo", SetLastError = false)] private static extern bool SystemParametersInfo(uint action, uint param, ref SKEY vparam, uint init); [DllImport("user32.dll", EntryPoint = "SystemParametersInfo", SetLastError = false)] private static extern bool SystemParametersInfo(uint action, uint param, ref FILTERKEY vparam, uint init); private const uint SPI_GETFILTERKEYS = 0x0032; private const uint SPI_SETFILTERKEYS = 0x0033; private const uint SPI_GETTOGGLEKEYS = 0x0034; private const uint SPI_SETTOGGLEKEYS = 0x0035; private const uint SPI_GETSTICKYKEYS = 0x003A; private const uint SPI_SETSTICKYKEYS = 0x003B; private static bool StartupAccessibilitySet = false; private static SKEY StartupStickyKeys; private static SKEY StartupToggleKeys; private static FILTERKEY StartupFilterKeys; private const uint SKF_STICKYKEYSON = 0x00000001; private const uint TKF_TOGGLEKEYSON = 0x00000001; private const uint SKF_CONFIRMHOTKEY = 0x00000008; private const uint SKF_HOTKEYACTIVE = 0x00000004; private const uint TKF_CONFIRMHOTKEY = 0x00000008; private const uint TKF_HOTKEYACTIVE = 0x00000004; private const uint FKF_CONFIRMHOTKEY = 0x00000008; private const uint FKF_HOTKEYACTIVE = 0x00000004; private const uint FKF_FILTERKEYSON = 0x00000001; [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct SKEY { public uint cbSize; public uint dwFlags; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct FILTERKEY { public uint cbSize; public uint dwFlags; public uint iWaitMSec; public uint iDelayMSec; public uint iRepeatMSec; public uint iBounceMSec; } private static uint SKEYSize = sizeof(uint) * 2; private static uint FKEYSize = sizeof(uint) * 6; /// <summary> /// False to stop the sticky keys popup. /// True to return to whatever the system has been set to. /// </summary> public static void AllowAccessibilityShortcutKeys(bool bAllowKeys) { if (!StartupAccessibilitySet) { StartupStickyKeys.cbSize = SKEYSize; StartupToggleKeys.cbSize = SKEYSize; StartupFilterKeys.cbSize = FKEYSize; SystemParametersInfo(SPI_GETSTICKYKEYS, SKEYSize, ref StartupStickyKeys, 0); SystemParametersInfo(SPI_GETTOGGLEKEYS, SKEYSize, ref StartupToggleKeys, 0); SystemParametersInfo(SPI_GETFILTERKEYS, FKEYSize, ref StartupFilterKeys, 0); StartupAccessibilitySet = true; } if (bAllowKeys) { // Restore StickyKeys/etc to original state and enable Windows key SystemParametersInfo(SPI_SETSTICKYKEYS, SKEYSize, ref StartupStickyKeys, 0); SystemParametersInfo(SPI_SETTOGGLEKEYS, SKEYSize, ref StartupToggleKeys, 0); SystemParametersInfo(SPI_SETFILTERKEYS, FKEYSize, ref StartupFilterKeys, 0); } else { // Disable StickyKeys/etc shortcuts but if the accessibility feature is on, // then leave the settings alone as its probably being usefully used SKEY skOff = StartupStickyKeys; if ( ( skOff.dwFlags & SKF_STICKYKEYSON ) == 0 ) { // Disable the hotkey and the confirmation skOff.dwFlags &= ~SKF_HOTKEYACTIVE; skOff.dwFlags &= ~SKF_CONFIRMHOTKEY; SystemParametersInfo(SPI_SETSTICKYKEYS, SKEYSize, ref skOff, 0); } SKEY tkOff = StartupToggleKeys; if ( ( tkOff.dwFlags & TKF_TOGGLEKEYSON ) == 0 ) { // Disable the hotkey and the confirmation tkOff.dwFlags &= ~TKF_HOTKEYACTIVE; tkOff.dwFlags &= ~TKF_CONFIRMHOTKEY; SystemParametersInfo(SPI_SETTOGGLEKEYS, SKEYSize, ref tkOff, 0); } FILTERKEY fkOff = StartupFilterKeys; if ( ( fkOff.dwFlags & FKF_FILTERKEYSON ) == 0 ) { // Disable the hotkey and the confirmation fkOff.dwFlags &= ~FKF_HOTKEYACTIVE; fkOff.dwFlags &= ~FKF_CONFIRMHOTKEY; SystemParametersInfo(SPI_SETFILTERKEYS, FKEYSize, ref fkOff, 0); } } } } #endif } 

我在游戏开始时使用它,并将参数设置为false,并在游戏退出之前将参数设置为true:

  /// <summary> /// This is the preferred way to return to the operating system. /// </summary> public void ExitAndTidyUP() { #if WINDOWS WindowsHelperAccessibilityKeys.AllowAccessibilityShortcutKeys(true); #endif Exit(); } 

据我所知,它完美的工作。

问候

注意上面提到的C#代码:你可以通过与结构的flags字段进行AND来转换这些问题行,如下所示:if((skOff.dwFlags&SKF_STICKYKEYSON)== 0)你需要添加行:私人常量uint FKF_FILTERKEYSON = 0x00000001; 在const定义下。

你也可以看看这个C#

 using System; using System.Windows.Forms; using System.Runtime.InteropServices; namespace WindowsFormsApplication1 { public partial class Form1 : Form { private const int MYKEYID = 0; // In case you want to register more than one... public Form1() { InitializeComponent(); RegisterHotKey(this.Handle, MYKEYID, MOD_ALT, Keys.Tab); this.FormClosing += Form1_FormClosing; } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { UnregisterHotKey(this.Handle, MYKEYID); } protected override void WndProc(ref Message m) { if (m.Msg == WM_HOTKEY && m.WParam.ToInt32() == MYKEYID) { Console.Beep(); } base.WndProc(ref m); } // P/Invoke declarations private const int WM_HOTKEY = 0x312; private const int MOD_ALT = 1; private const int MOD_CONTROL = 2; private const int MOD_SHIFT = 4; [DllImport("user32.dll")] private static extern int RegisterHotKey(IntPtr hWnd, int id, int modifier, Keys vk); [DllImport("user32.dll")] private static extern bool UnregisterHotKey(IntPtr hWnd, int id); } } 

在这里找到它http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/47647b7e-b23f-4f80-9363-ffd5f11a2570

干杯