禁用 .NET 应用程序中的辅助功能快捷方式?

发布于 2024-07-16 23:48:02 字数 523 浏览 13 评论 0原文

这篇 msdn 文章 -- http://msdn.microsoft .com/en-us/library/bb219746(VS.85).aspx#Disabling_Accessibility_Shortcut_Keys - 为 C++ 程序员提供有关如何临时禁用 Windows 辅助功能快捷方式的信息(例如按住 Shift 8 秒,或快速连续按 Shift 超过 5 次)。

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

我想要做的就是不要出现烦人的弹出窗口; 不过,我更喜欢一些不必破坏 Windows 设置的东西,以防万一应用程序以非正常方式关闭(我不希望在这些情况下永久更改用户的设置) 。

有什么想法吗?

This msdn article -- http://msdn.microsoft.com/en-us/library/bb219746(VS.85).aspx#Disabling_Accessibility_Shortcut_Keys -- provides information for C++ programmers on how to temporarily disable the windows shortcuts for accessibility (such as holding Shift for 8 seconds, or pressing Shift more than 5 times in quick succession).

Surely there's some easy way to do this in C#, but I can't find any resources on this. I'm using DirectInput in a non-fullscreen application.

All I want to do is not have the annoying popups come up; I'd prefer something that doesn't have to muck with the windows settings, though, just in case the application shuts down in a non-graceful manner (I'd prefer not to have the user's settings be permanently altered in those situations).

Any thoughts?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

盛夏尉蓝 2024-07-23 23:48:02

以防万一其他人需要这个,这里是转换后的 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 语句(这些语句已被注释掉)。 Microsoft 推荐这些,但我不知道如何让它们在 C# 中工作。 此外,我没有在结构上使用 sizeof() (而是手动为其大小创建变量),因为这样做需要不安全的代码,而且我不希望这是我的特定程序的要求。

Just in case anyone else needs this, here's the converted C# code, which at last does work:

    [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 );
            }
        }
    }

Do note that I was unable to convert three of the IF statements from C++ (those are commented out). Microsoft recommends those, but I don't know a way to make them work in C#. Additionally, I'm not using sizeof() on the structs (instead manually creating variables for their size), because to do that would require unsafe code, and I don't want that to be a requirement for my particular program.

梦晓ヶ微光ヅ倾城 2024-07-23 23:48:02

感谢各位在我的 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();
    }

据我所知,它运行得很好。

问候

Thanks guys with some minor finishing off that worked in my XNA game to prevent the sticky key popup.

Here is the finished code:

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
}

I use it at the start of the game with the parameter set to false and just before the game exits with the parameter set to true:

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

It works perfectly as far as I can tell.

Regards

绅士风度i 2024-07-23 23:48:02

您必须执行与您引用的链接中相同的操作。 SystemParametersInfo API 函数可以通过 P/Invoke 层调用,您可以在此处找到定义:

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

You will have to do the same thing that is done in the link you reference. The SystemParametersInfo API function can be called through the P/Invoke layer and you can find the definition here:

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

呆° 2024-07-23 23:48:02

关于上面发布的 C# 代码的注意事项:
您可以通过与结构体的 flags 字段进行 AND 运算来转换这些问题行,如下所示:
if ((skOff.dwFlags & SKF_STICKYKEYSON) == 0)
您需要添加以下行:
私有常量 FKF_FILTERKEYSON = 0x00000001;
也在 const 定义下。

Note in relation to the C# code posted above:
You can convert those problem lines by AND-ing with the flags field of the struct like so:
if ((skOff.dwFlags & SKF_STICKYKEYSON) == 0)
You'll need to add the line:
private const uint FKF_FILTERKEYSON = 0x00000001;
under the const definitions as well.

沙沙粒小 2024-07-23 23:48:02

你可能会看一下,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

干杯

You may look this also 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);
  }
}

found it here
http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/47647b7e-b23f-4f80-9363-ffd5f11a2570

cheers

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文