Как отличить вырезку от копирования
Когда GetClipboardData() используется для доступа к данным, захваченным буфером обмена, существует ли вызов API или флаг для различения действия копирования (CTRL+C) и действия вырезания (CTRL+X)?
Что я уже пробовал:
Поиск в интернете. Вообще говоря, я не смог найти никакой документации о разнице между вырезанием и копированием, когда речь заходит о данных, захваченных буфером обмена
0x01AA
Очень хороший вопрос. Я просто попробовал следующее, чтобы проверить, работает ли операция разреза между приложениями:
а) вырезать текстовый файл в Проводнике Windows
б) вставьте его в документ Word
Результат:
Файл копируется в документ word, но не удаляется в файловой системе проводником.
[Редактировать]
В то время как наоборот, вырезать файл из WinWord doc и вставить его с помощью проводника, файл исчезает из word doc....
Richard MacCutchan
Это совершенно другой тест, и он не будет делать то, что вы ожидаете. Вырезать и вставить файлы будет работать только в Проводнике, так как это приложение удаляет оригинал, когда оно вставляет его в новое место. Вставка его в Word означает, что проводник никогда не увидит операцию вставки.
Michael Haephrati
Это может быть другое ограничение, но предположим, что вы разрабатываете приложение 1, а пользователь, запускающий Приложение 2, вырезает текст и вставляет его в одно и то же приложение (App2). Есть способы запечатлеть этот текст, но мне интересно, как можно определить, была ли это копия или вырезка...
0x01AA
Я больше думал о том, что приложение cuting (владелец буфера обмена (?)) получает, наконец, что-то вроде события "paste_executed". Но, похоже, все не так. И я также узнал, что слово imediatelly показывает "cuted", в то время как Explorer показывает ему что-то вроде "помечено как вырезано". Извините за мой английский :-)
Во всяком случае ваш вопрос был интересным и заставил меня задуматься о некоторых деталях
Jochen Arndt
У тебя была правильная идея.
Смотрите мой ответ ниже. Это объясняет, почему проводник показывает такие файлы помеченными.
Существует нечто похожее на событие "paste_executed". Целевой объект создает два объекта буфера обмена CFSTR_PASTESUCCEEDED и CFSTR_PERFORMEDDROPEFFECT, которые считываются источником (проводником). Таким образом, он знает, когда вставка прошла успешно, и может удалить файл или обновить дисплей в зависимости от действия, выполненного целью.
0x01AA
Большое вам спасибо за подсказку.
Richard MacCutchan
Вы не можете определить разницу. Вырезать и копировать выполняют точно так же, они отправляют некоторую информацию в буфер обмена. Это зависит от приложения, которое выполняет вырезание, чтобы решить, когда удалить исходные данные.
0x01AA
См. комментарий Йохена выше
Richard MacCutchan
Да, но это все еще не говорит вам, была ли первоначальная операция сокращением или копией.