0

私は2つのWinformアプリケーションを持っており、そのテキストをコピーして貼り付けようとすると、ProcessCmdKey貼り付けられていないことを確認すると正しく機能します..

しかし、メモ帳にテキストを貼り付けようとすると、貼り付けられます...同じアプリケーションでテキストのコピーと貼り付けを実現したいだけです

他の Windows フォームに焦点を当てる場合、テキストを貼り付ける必要はありません...方法はありますか..

   private const Keys CopyKeys = Keys.Control | Keys.C;
    private const Keys PasteKeys = Keys.Control | Keys.V;

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {

        bool bVal = false;
        Process[] p2 = Process.GetProcesses();
        foreach (Process pro in p2)
        {
            if (string.Compare(pro.ProcessName, "TestForm.vshost", true) == 0 && (keyData == CopyKeys) || (keyData == PasteKeys))
            {
                bVal = true;  // Text will be pasted 
                return true;
            }
            else
                return base.ProcessCmdKey(ref msg, keyData); // Text will not be pasted
        }
        return bVal;
    }

これは正しく動作します。メモ帳のワードパッドでも同じことを達成しようとすると。貼り付けです。

4

2 に答える 2

2

他のアプリケーションがクリップボードのデータを取得できないことを本当に確認したい場合は、カスタム形式を使用して、データを自分でクリップボードに入れる必要があります。

これは、その方法の一例にすぎません。(定義上)すべてのアプリケーションで使用できる事前定義されたデータ形式を使用する代わりに、Ctrl + Cを自分でインターセプトしてデータをクリップボードに入れる必要があるため、実用的なソリューションを得るにはさらに多くの作業が必要です。

public void cmdTest_Click(object sender, EventArgs e)
{
    Clipboard.SetData("MyCustomFormat", new MyData("This text should not be pasted"));
    if(Clipboard.ContainsData("MyCustomFormat"))
    {
        MyData result = Clipboard.GetData("MyCustomFormat") as MyData;
        MessageBox.Show(result.MyValue);
    }   
}

[Serializable]
class MyData
{
    string _internalValue;
    public MyData(string newValue)
    { _internalValue = newValue;}
    public string MyValue
    {
        get{return _internalValue;}
    }
}

この方法に従うと、他のアプリケーションはカスタム形式を使用できません(もちろん、セキュリティが本当に懸念される場合は、さらに調整が必要になります)

于 2013-01-10T12:03:32.847 に答える
0

アプリケーションが最小化されたとき、またはフォーカスが失われたときに、クリップボードのテキストをクリアできます。

于 2013-01-10T11:46:21.613 に答える