Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Just in case anyone else needs this, here's the converted C# code, which at last does work:</p> <pre><code> [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 &amp; SKF_STICKYKEYSON ) == 0 ) { // Disable the hotkey and the confirmation skOff.dwFlags &amp;= ~SKF_HOTKEYACTIVE; skOff.dwFlags &amp;= ~SKF_CONFIRMHOTKEY; SystemParametersInfo( SPI_SETSTICKYKEYS, SKEYSize, ref skOff, 0 ); } SKEY tkOff = StartupToggleKeys; //if ( ( tkOff &amp; TKF_TOGGLEKEYSON ) == 0 ) { // Disable the hotkey and the confirmation tkOff.dwFlags &amp;= ~TKF_HOTKEYACTIVE; tkOff.dwFlags &amp;= ~TKF_CONFIRMHOTKEY; rs = SystemParametersInfo( SPI_SETTOGGLEKEYS, SKEYSize, ref tkOff, 0 ); } FILTERKEY fkOff = StartupFilterKeys; //if ( ( fkOff &amp; FKF_FILTERKEYSON ) == 0 ) { // Disable the hotkey and the confirmation fkOff.dwFlags &amp;= ~FKF_HOTKEYACTIVE; fkOff.dwFlags &amp;= ~FKF_CONFIRMHOTKEY; SystemParametersInfo( SPI_SETFILTERKEYS, FKEYSize, ref fkOff, 0 ); } } } </code></pre> <p>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.</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload