Как отключить параметры копирования и вставки в C# Winforms

У меня есть два приложения 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;
    }

Это работает правильно. Когда я пытаюсь добиться того же самого для блокнота WordPad. Это вставляется.

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

Если вы воспользуетесь этим методом, другие приложения не смогут использовать ваш пользовательский формат (конечно, если безопасность представляет собой реальную проблему, потребуется дополнительная настройка)

Вы можете очистить текст буфера обмена, когда ваше приложение свернуто или потеряно в фокусе.

Другие вопросы по тегам