1

一部の Cyber​​intelligensia の助けを借りて、Ctrl+[表示可能なキー]、Ctrl+Shift+[表示可能なキー]、および Ctrl+Shift+Alt+[表示可能なキー] の組み合わせを使用して、アクセント付きの文字をテキストボックス。

質問とその回答はこちらです。

ただし、まだ1つの反抗的な組み合わせがあります。CodeCaster の提案を使用して、「Debug.WriteLine(keyData);」への呼び出しを追加しました。ターネーションで何が押されたか (どのキー) かを確認します。ほとんどの場合、これで問題なく動作します。たとえば、「Ctrl + Shift + E」をマッシュすると、次のように報告されます。

ControlKey, Control
ShiftKey, Shift, Control
E, Shift, Control

期待どおりに応答しており、テキストボックスに「É」が入力されています。この手法は、「!」に応答するために何が必要かを理解するのに役立ちました。文字 (D1)。

ただし、識別できないキーの組み合わせが 1 つあります。それは、「Ctrl+Shift+N」です (Ctrl+N が機能します)。「Ctrl+Shift+N」を押すと、出力ウィンドウに次のように報告されます。

ControlKey, Control
ShiftKey, Shift, Control

IOW、予想される「N」が欠落しているため、テキストボックスには何も追加されません (「Ñ」を追加する必要があります)。

これは失敗する唯一のケースです。他のすべてのキーの組み合わせが機能します。

Ctrl+N機能します。テキストボックスに「ñ」が表示され、次のようになります。

ControlKey, Control
N, Control

...出力ウィンドウで。

Ctrl+Shift+N コードの「N」が「聞こえない」のはなぜですか?どうすれば修正できますか?

これは私が今持っているコードです:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    Debug.WriteLine(keyData);
    if (this.ActiveControl != null && this.ActiveControl is TextBox)
    {
        string replacement = "";
        TextBox tb = (TextBox)this.ActiveControl;
        bool useHTMLCodes = checkBoxUseHTMLCodes.Checked;

        // ...

        // N
        if (keyData == (Keys.Control | Keys.N))
        {
            replacement = useHTMLCodes ? "ñ" : "ñ";
        }
        else if (keyData == (Keys.Control | Keys.Shift | Keys.N))
        {
            replacement = useHTMLCodes ? "Ñ" : "Ñ"; // not working
        }

        // ...

        if (replacement != "")
        {
            tb.SelectedText = replacement;
            return true;
        }
    }

    return base.ProcessCmdKey(ref msg, keyData);
}

前述のように、「Ñ」を発行する必要がある Ctrl+Shift+N をトラップするコードを除いて、すべてが機能します。

アップデート

私はこれを追加しました:

tb.ShortcutsEnabled = false;

...ここからですが、問題にはなりません。

更新 2

奇妙なことに、メモ帳を開くための Ctrl+Shift+N キーボード ショートカットは、デスクトップ (議論中のユーティリティで作業している場所) では機能しなくなりました、リモート デスクトップ セッション (Sharepoint で作業している場所) では機能します。 )。

リモート デスクトップ接続は本当にデスクトップでのキーストロークをインターセプトしていますか?

ただし、リモート デスクトップ セッションからログオフした場合でも、このデスクトップ ユーティリティ内に「ブラインド スポット」(Ctrl+Shift+N) が残ります。

4

1 に答える 1

4

これを試してください。他の誰かが既に Ctrl-Shift-N をホットキー コンボとして登録しているかどうかを教えてくれますRegisterHotkey():

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    private const int MOD_ALT = 0x0001;
    private const int MOD_CONTROL = 0x0002;
    private const int MOD_SHIFT = 0x0004;
    private const int MOD_WIN = 0x0008;

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc);

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

    private void button1_Click(object sender, EventArgs e)
    {
        bool result = RegisterHotKey(this.Handle, 1001, MOD_CONTROL | MOD_SHIFT, (int)Keys.N);
        if (result)
        {
            UnregisterHotKey(this.Handle, 1001);
        }

        string msg = result ? " was NOT " : " WAS ";
        MessageBox.Show("The Ctrl-Shift-N combination" + msg + "already registered on your system.");
    }

}

コンボが既にシステムに登録されていると言って戻ってきた場合、コンボを登録したアプリによってコンボが既に「消費」されているため、アプリには到達しません。

そのコンボが登録されていない場合、別のアプリケーションが低レベルのキーボード フック (WH_KEYBOARD_LL) を介してそれをトラップし、そこから消費している可能性があります。しかし、これを知る方法はありません...

于 2015-07-02T16:46:50.277 に答える