gpt4 book ai didi

c# - 在 .NET 应用程序中禁用辅助功能快捷方式?

转载 作者:可可西里 更新时间:2023-11-01 13:03:17 28 4
gpt4 key购买 nike

这篇 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 设置混淆的东西,以防万一应用程序以非优雅的方式关闭(我不希望在这些情况下永久更改用户的设置) .

有什么想法吗?

最佳答案

为了以防万一其他人需要这个,这里是转换后的 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()(而是手动为其大小创建变量),因为这样做需要不安全的代码,我不希望这是我的特定程序的要求。

关于c# - 在 .NET 应用程序中禁用辅助功能快捷方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/734618/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com