1

ALT一部の Windows キーボード ショートカット (例: + TABLWIN/ RWINALT+ )を抑制して、アプリケーションが別の方法でそれらを処理できるようにしようとしてF4います (外部マシンでのキー押下のシミュレーション)。

他のSOの質問と回答によると、これはうまくいくはずです:

        this.PreviewKeyDown += (s, e) => {
            if (e.Key == Key.LWin || e.Key == Key.RWin)
                e.Handled = true;
        };

問題は、それが機能しないことです。LWIN/を押すたびにRWIN、アプリケーションだけで使用できるように抑制したいスタートメニューがポップアップします。上記のスニペットでthisは、これのテスト中にフォーカスされていた WPF ウィンドウを参照しています。(明らかに、ウィンドウにフォーカスがある場合にのみアクションを抑制する必要があります。)

私が達成したいことを達成する方法はありますか?

ありがとう、

〜Tgys

4

1 に答える 1

2

入力のソースを検出するために、すべてのキーボードイベントとマウスイベントをフックすることができます。つまり、以下のリンクで説明されているようにグローバル フックを使用すると、システム イベントをキャプチャして、通常のイベントのように処理するか、または抑制することができます。

このCodeProjectの記事、Processing Global Mouse and Keyboard Hooks in C# をご覧ください。

MSDN リファレンス:

グローバル フックは、呼び出しスレッドと同じデスクトップ内のすべてのスレッドのメッセージを監視します。スレッド固有のフックは、個々のスレッドのみのメッセージを監視します。グローバル フック プロシージャは、呼び出しスレッドと同じデスクトップ内の任意のアプリケーションのコンテキストで呼び出すことができるため、プロシージャは別の DLL モジュール内にある必要があります。スレッド固有のフック プロシージャは、関連するスレッドのコンテキストでのみ呼び出されます。

C# コード:

using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public partial class MainWindow : Window
{
    // Structure contain information about low-level keyboard input event
    [StructLayout(LayoutKind.Sequential)]
    private struct KBDLLHOOKSTRUCT
    {
        public Keys key;
        public int scanCode;
        public int flags;
        public int time;
        public IntPtr extra;
    }

    //System level functions to be used for hook and unhook keyboard input
    private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(int id, LowLevelKeyboardProc callback, IntPtr hMod, uint dwThreadId);
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool UnhookWindowsHookEx(IntPtr hook);
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr CallNextHookEx(IntPtr hook, int nCode, IntPtr wp, IntPtr lp);
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr GetModuleHandle(string name);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern short GetAsyncKeyState(Keys key);

    //Declaring Global objects
    private IntPtr ptrHook;
    private LowLevelKeyboardProc objKeyboardProcess;

    private IntPtr CaptureKey(int nCode, IntPtr wp, IntPtr lp)
    {
        if (nCode >= 0)
        {
            KBDLLHOOKSTRUCT objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lp, typeof(KBDLLHOOKSTRUCT));
            if (objKeyInfo.key == Keys.RWin || objKeyInfo.key == Keys.LWin) // Disabling Windows keys
            {
                return (IntPtr)1;
            }
        }
        return CallNextHookEx(ptrHook, nCode, wp, lp);
    }

    public MainWindow()
    {
        InitializeComponent();

        //Get Current Module
        ProcessModule objCurrentModule = Process.GetCurrentProcess().MainModule;
        //Assign callback function each time keyboard process
        objKeyboardProcess = new LowLevelKeyboardProc(CaptureKey);
        //Setting Hook of Keyboard Process for current module
        ptrHook = SetWindowsHookEx(13, objKeyboardProcess, GetModuleHandle(objCurrentModule.ModuleName), 0); 
    }
}

その他の参考資料:

  1. 不要なキーストロークを停止するための C# からの低レベル Windows API フック
  2. Win App C# で特殊キーを無効にする
于 2012-11-10T17:33:48.620 に答える