2009-10-11 3 views
0

Im думает создать простое приложение для хранения того, что я скопировал с помощью Ctrl + C. Теперь я Googled некоторые интересные код: (я скорее буду размещать ссылку на него, как его огромный)C# - Перезаписать Ctrl + C control

http://www.prilepi.com/221 (по http://www.liensberger.it/web/blog/?p=207)

http://www.prilepi.com/222

Теперь вещь работает отлично, единственная проблема в том, что оно полностью перезаписывает все. Это означает, что, когда я выбираю текст и нажимаю Ctrl + C, я не могу получить текст, который я выбрал.

Я знаю Clipboard класса, но ничего не сохраняется в ...

+0

FrEaKmAn: Можете ли вы изменить название своего вопроса, чтобы сделать его более понятным? так как из моего ответа я ушел ниже, я неправильно интерпретировал его. – t0mm13b

ответ

0

Горячий ключ полностью скрывает сообщение от других окон, как вы сказали. Что вам нужно сделать, так это найти окно с фокусом, а затем прочитать текст, который он выбрал (и, возможно, добавить его в буфер обмена вручную, я думаю?)

Этот фрагмент должен найти сфокусированное окно. Это на C++, но вы можете легко перевести его на C#.

HWND GetGlobalFocus() 
{ 
    GUITHREADINGO info; 
    info.cbSize = sizeof(info); 

    if (!GetGUIThreadInfo(0, &info)) 
     return NULL; 

    return info.hwndFocus; 
} 

После того, как вы это сделаете, это становится сложным. Вы можете сделать PostMessage(hWnd, WM_COPY, 0, 0);, но он не будет работать, если элемент управления не поддерживает это (любой выделенный синтаксис элемент управления, скорее всего, не является стандартным и, как таковой, может не отвечать на это).

Вы можете вручную отправить сообщение WM_GETTEXT, чтобы получить текст, а затем вручную добавить его в буфер обмена, но опять же это скорее всего не удастся его контролировать в значительной степени нестандартным, не говоря уже о том, что он не сохранит приложения возможно несколько форматов буфера обмена (думаю, Word).

Другой вариант - когда вы получаете горячую клавишу, отключите свой крючок, снова отправьте комбинацию клавиш с keybd_event, а затем снова включите свой крючок, и у вас будут данные в вашем буфере обмена. Это кажется неуклюжим, но может работать, если keybd_event блокирует или нет, я не могу вспомнить.

Надеюсь, это поможет!

+0

Хм, как я понимаю, он копирует выделенный текст на сфокусированное окно. Теперь я нашел несколько решений в Интернете, но никто из них не работал. Может быть, потому что, когда я отлаживаю, VS сфокусированное окно и не выбран текст ... – FrEaKmAn

+0

'WM_COPY'? Да, это то, что он делает, но выбранное окно должно поддерживать сообщение. Вы обнаружите, что половина текстовых редакторов ничего не сделает, когда они получат это сообщение. Я думаю, что ваш лучший выбор - последний вариант. – Blindy

+0

И да, вы, очевидно, не можете пройти через такой код, вы должны просто спамить журнал отладки со всем, что делает ваш код, и посмотреть, где он не работает, прочитав вывод. – Blindy

0

Чтобы добавить Somthing в буфер обмена вы можете использовать:

Clipboard.SetText(Text, TextDataFormat.Text); 

Есть несколько других вариантов форматирования, чем просто текст, а

+0

его не проблема установить что-то. Это проблема, чтобы получить его! – FrEaKmAn

0

Существует еще один способ сделать это, хотя это немного слабый , предположим, что у вас есть текстовое поле, которое ожидает ввода, вы можете назначить пустое контекстное меню, создав новое контекстное меню, в котором нет ничего, а затем назначьте его в текстовое поле. Таким образом, пользователь не может щелкнуть правой кнопкой мыши, чтобы открыть контекстное меню по умолчанию для копирования/вставки.

Edit:Поскольку OP отвечал на вопрос, который не совсем ясно, «C# перезапись Ctrl + C код», я думал, что он имел в виду, чтобы предотвратить использование Ctrl + C, чтобы скопировать в буфер обмена , Извините, если мой ответ неверен. Можете ли вы, пожалуйста, уточнить свой вопрос немного больше, поскольку это кажется вводящим в заблуждение.

Edit # 2: После замечания Op, я могу дать подсказку о том, что он пытается выполнить, для начала, головой к CodeProject и прочитать эту article и крюк в буфер обмена крючок на глобальной основе и дело сделано! Не нужно класть глобальную клавиатуру! Подключите событие ClipboardChanged и ClipboardStateChanged.

Надеюсь, это поможет, С уважением, Tom.

+0

Позвольте мне упростить его. Представьте себе программу, в которой вы можете следить за тем, что было скопировано/вставлено. Поэтому мне нужно определить, когда пользователь нажимает CTRL + C, получает выделенный текст, но в то же время я не изменяю CTRL + C по умолчанию ... – FrEaKmAn

+0

@FrEaKmAn: Это похоже на установку глобальной клавиатуры для контроля Ctrl + C и узнать, из какого окна это ... с другой записью, Ctrl + C - это системная вещь для копирования в буфер обмена. Возможно, изнутри глобального крючка, когда нажата ctrl + C, отправляйте специальное сообщение в свое окно вдоль с информацией о том, на каком дескрипторе окна он находится там, где выполняется копирование в буфер обмена. – t0mm13b

+0

это звучит возможно. Но я все еще теряю, как это сделать. – FrEaKmAn

Смежные вопросы