1

更新: 問題の原因を突き止めました。現在、最適な修正方法を見つけようとしています。

あらゆる種類の機能を備えた、カスタマイズされた MenuStrip を備えたフォームがあります。ここで注目すべきは、私の MenuStrip 項目の多くにキーボード ショートカットがあることです。つまり、切り取り/コピー/貼り付けのショートカットです。

この MenuStrip が存在すると、テキスト ボックス (およびその他のコントロール) の既定の切り取り/コピー/貼り付けのキーボード ショートカット動作が上書きされている (したがって、キャンセルされている) ようです。

それらのすべて。

.

MenuStrip の切り取り/コピー/貼り付けオプションには理由があるとは言えませんが、そこに表示されることを期待しているという事実以外にはありません。それが Office タイプのプログラムの動作であり、ユーザー (私自身も含む) が期待するものです。

MenuStrip から切り取り/コピー/貼り付けオプションを削除することもできますが、それでは敗北を認めることになります。では、過度に設計された MenuStrip によって、切り取り/コピー/貼り付けに適したすべてのコントロールのカスタム コードの実装を強制されないようにするにはどうすればよいでしょうか?

.


** 元の投稿: ** プログラム全体で使用される TextBox コントロールをツールバーに持っています。ネイティブの OS レベルのコピー/貼り付けイベントがデフォルトでサポートされていなかったときの驚きを想像してみてください。

確かに、何かを手動でコーディングすることはできますが、コントロールを右クリックすると、カット/コピー/ペーストが既に組み込まれています。この既存の機能をどのように活用できますか?

Ctrl+C、P、および X を使用して KeyDown イベントを追加することは、コード化する必要がある最大数になると考えています。これらのイベントについては、組み込みメソッドか何かを呼び出すだけです。それか、ネイティブのカット/コピー/ペーストを有効にする設定を見つけてください。

私は何を見落としていますか?

4

2 に答える 2

1

簡単な解決策: Clickイベント内でSendKeys.Send()呼び出しを使用します。

SendKeys.Send("^X"); 

私はもう少し複雑なことをしているので、詳細は次のとおりです。MenuStrip、StatusStrip、およびその他のいくつかのカスタムコントロールなど、すべてがいくつかのカスタムコントロールを共有するいくつかのフォームを作成しています。多くのものの共通の実装を可能にするために、Formsをすべて同じ基本クラスから継承することにしました。

public partial class CommonFormBase : Form
{
    private void Initialize()
    {
        //Bind click event for custom MenuStrip to events in the local Form
        CommonMenuStrip.Edit_Cut.Click += new EventHandler(Edit_Cut_Click);
        CommonMenuStrip.Edit_Copy.Click += new EventHandler(Edit_Copy_Click);
        CommonMenuStrip.Edit_Paste.Click += new EventHandler(Edit_Paste_Click);
    }

    //Implement Click events for the MenuStrip by calling local methods
    internal void Edit_Cut_Click(object sender, EventArgs e) { Cut(); }
    internal void Edit_Copy_Click(object sender, EventArgs e) { Copy(); }
    internal void Edit_Paste_Click(object sender, EventArgs e) { Paste(); }

    //Generic implementation of common commands for the CommonFormBase
    public virtual void Cut() { SendKeys.Send("^X"); }
    public virtual void Copy() { SendKeys.Send("^C"); }
    public virtual void Paste() { SendKeys.Send("^V"); }
}

MenuStripのクリックイベントをフォームレベル(MenuStripレベルではない)で実装しましたが、その場合、すべてのコードを実行するジェネリックメソッドのみを呼び出します。この例ではやり過ぎですが、子フォームごとに機能が変わる他のMenuStripコマンドがあるので、すべて同じように機能させる方が簡単だと思いました。

とにかく、これはほぼ完璧に機能します!ショートカットキーでアクティブ化されたMenuStrip_Clickイベントを基になるコントロール(またはフォーム?)にプッシュし、デフォルトのショートカットキーイベントを実装しているようです。

それが間違っている唯一のことは、Ctrl + V + V +V...を実行するかCtrl+Vを押したときに1回だけトリガーされることです。それでも、それは複数のイベントを認識しないトリガーの問題であり、ソリューション自体の問題ではありません。

于 2012-10-21T15:19:26.983 に答える
1

ContextMenuまたはをオーバーライドしない限り、ネイティブのコピー アンド ペーストをテストして TextBox コントロールで動作しますContextMenuStrip。その場合は、ClipBoard クラスを使用して自分で実装する必要があります。


さらに詳しく見ると、このMSDN フォーラムの記事では、SendMessage メソッドを使用してコマンドをネイティブ テキストボックス コントロールに送信する方法について説明しています。これは、あなたがしていることのように聞こえるカスタム TextBox に実装されています。

さらなる実装については、小さな抜粋の記事を参照してください。

protected void itemCut_Click(object sender, EventArgs e)
{
   SendMessage(this.Handle, TextBoxMessages.WM_CUT, 0, 0);
}


public static class TextBoxMessages
{
    public const int EM_UNDO = 0x00C7;
    public const int WM_CUT = 0x0300;
    public const int WM_COPY = 0x0301;
    public const int WM_PASTE = 0x0302;
}
于 2012-10-20T16:37:29.503 に答える