2009-04-09 22 views
7

Bu msdn makalesi - http://msdn.microsoft.com/en-us/library/bb219746(VS.85).aspx#Disabling_Accessibility_Shortcut_Keys - erişilebilirlik için Windows kısayollarının geçici olarak nasıl devre dışı bırakılacağı hakkında C++ programcıları için bilgi sağlar (örneğin, Shift tuşunu 8 saniye tutmak veya Shift tuşuna art arda 5 defadan fazla basarak)..NET Uygulamasında Erişilebilirlik Kısayollarını Devre Dışı Bırakma?

Şüphesiz bunu C# içinde yapmanın kolay bir yolu var, ancak bu konuda herhangi bir kaynak bulamıyorum. DirectInput'ı tam olmayan bir uygulamada kullanıyorum.

Tüm yapmak istediğim rahatsız edici açılır pencereleri yok; Pencerenin ayarlarıyla uğraşmak zorunda kalmayan bir şeyi tercih ederim, ancak, uygulamanın zarif olmayan bir şekilde kapanması durumunda (kullanıcının bu ayarları sürekli olarak değiştirmemesini tercih ederim) .

Herhangi bir düşünce?

cevap

2

Referans yaptığınız bağlantıda yapılanla aynı şeyi yapmak zorundasınız. SystemParametersInfo API fonksiyonu P içinden çağrılabilir/katman çağırmak ve burada tanımını bulabilirsiniz:

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

+0

Tamam ... Kalıcı olmayan bir şey umuyordum, ama bu da iyi. Teşekkürler! – x4000

+0

@ x4000: Sorunuz, kısayol tuşlarının geçici olarak nasıl devre dışı bırakılacağını gösterir. Aynı API denir, bu yüzden kodu aynı şekilde yapılandırmanız ve aynı zamanda da kalıcı olmaması gerekir. – casperOne

+0

Eh, sanırım yanlış anladım - işiniz bittiğinde tekrar açacağınız beklentisiyle, nasıl kapatılacağını ve tekrar açacağınızı gösterir. Uygulama çökene kadar hepsi iyi ve güzel. – x4000

6

Sadece durumda başkasının buna ihtiyacı, burada çalışır sonunda dönüştürülen C# kodu verilmiştir:

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

Ben C IF ifadeleri ++ (bu yorum haline) üçünü dışarı attı olduğunu unutmayın. Microsoft bunları önerir, ancak onları C# 'da çalıştırmanın bir yolunu bilmiyorum. Ayrıca, yapıları üzerinde sizeof() kullanmıyorum (bunun yerine, boyutları için değişkenler oluşturarak), çünkü bunu yapmak için güvensiz kod gerektiriyordu ve bunun belirli bir program için bir gereksinim olmasını istemiyorum. Sen AND bu sorun hatları dönüştürebilirsiniz:

0

Ayrıca 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); 
    } 
} 

C# kodu ile ilişkili olarak burada http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/47647b7e-b23f-4f80-9363-ffd5f11a2570

alkış

2

Not buldum yukarıda yayınlanan bu görünebilir yapısındaki bayraklar alanı ile -ing: ((skOff.dwFlags & SKF_STICKYKEYSON) == 0) Siz ' satırı eklemeniz gerekir: private const uint FKF_FILTERKEYSON = 0x00000001; Yapı tanımları altında .

5

Yapışkan tuş pop-up'ını engellemek için XNA oyunumda çalışan bazı küçük bitirme işlemleri yapan çocuklar.

/// <summary> 
    /// This is the preferred way to return to the operating system. 
    /// </summary> 
    public void ExitAndTidyUP() 
    { 
#if WINDOWS 
     WindowsHelperAccessibilityKeys.AllowAccessibilityShortcutKeys(true); 
#endif 
     Exit(); 
    } 
: Ben false ve sadece doğru olarak ayarlanmış parametre ile oyun çıkmadan önce ayarlanmış parametre ile oyunun başında kullanmak

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 
} 

: Burada

bitmiş koddur

Anlatabildiğim kadarıyla mükemmel çalışıyor.

Saygılar