Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 963

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Сделал менеджер паролей - готовый лень искать, да и потренироваться нужно по работе с буфером. По одной кнопке в буфере логин, по другой - пароль. Чтобы еще ленивей было, захотел, чтобы буфер обновлялся после скидывания информации в окно формы. Но интуиция и здравый смысл мне подсказывает, что мое приложение не может знать, что происходит за пределами его формы. Я прав?
Придется по таймеру, раз лень второй раз кнопку тискать.

Толяныч Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Толяныч (статус: 4-ый класс)
Вопрос отправлен: 2 апреля 2010, 00:36
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 10; последнее сообщение — 8 апреля 2010, 12:45; участников в обсуждении: 4.
min@y™

min@y™ (статус: Доктор наук), 2 апреля 2010, 08:41 [#1]:

Предлагаю ловить WM_PASTE, посланное в активное окно. Если это удасться - по этому событию очищать буфер обмена.
Ставить такие хуки я не пробовал и даже не в курсе, возможны они или нет - нужды не было.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Толяныч

Толяныч (статус: 4-ый класс), 2 апреля 2010, 22:20 [#2]:

У меня в приложении только заносится текст в Сlipboard. Дальше я перехожу в окно брауэера и жму Ctrl/V. Я так думаю, если фокус ввода перешел в другое окно и моя форма стала неактивной, то оно уже не может отслеживать события КЛАВИША НАЖАТА ? Поиск дескрипторов чужого окна я не использую.
В общем, задача для общего развития и углубления понятия, прикладное ее значение невелико.
Спасибо за ответ.
Вадим К

Вадим К (статус: Академик), 2 апреля 2010, 23:06 [#3]:

Вставить то можно и через меню правой кнопки. Поэтому перехватывать Ctrl+V не совсем корректно. Хотя кто мешает сделать свою горячую кнопку? и никаких буферов обмена:)
Некоторые пользователи за "испорченный буфер обмена" по голове не погладят:)
Галочка "подтверждения прочтения" - вселенское зло.
Толяныч

Толяныч (статус: 4-ый класс), 3 апреля 2010, 14:48 [#4]:

На компе один пользователь - с ним проблемы не будет :-) А насчет "свою горячую кнопку"... Если правильно соображаю, то это вариации на тему "Заглядываем в чужие окна". Я с этим пока обломался, но тут в форуме был готовый фрагмент, и будет время, попытаюсь все-таки додавить эту тему.
А горячая клавиша в моем приложении работать не будет, если фокус ввода ушел на другую форму. Или нет ?
Amidamaru

Amidamaru (статус: 4-ый класс), 3 апреля 2010, 19:50 [#5]:

Горячая клавиша на то и горячая. :)
Делается всё примерно так:
При запуске программы регистрируется горячая клавиша (а точнее сочетание клавиш).
Когда это сочетание нажимают - твоей проге приходит сообщение об этом.
Далее несколько вариантов:
1) твоя прога заносит нужные данные в буфер обмена и используя SendInput или keybd_event отправляет системе Ctrl+V (отправляет системе а та сама разберётся кому передать ;)
2) используя те же SendInput или keybd_event, или можно найти в инете SendKeys и сэмулировать нажатия нужных клавиш - набор логина/пароля.
3) ищем, а точнее получаем дескриптор активного окна GetForegroundWindow и отправляем ему чтонить вроде WM_SETTEXT с нужным текстом
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.
Толяныч

Толяныч (статус: 4-ый класс), 4 апреля 2010, 11:38 [#6]:

Спасибо! Столько информации, есть над чем думать и экспериментировать.
Толяныч

Толяныч (статус: 4-ый класс), 8 апреля 2010, 11:18 [#7]:

К сожалению, вариант не прокатил. Хоть она и горячая, но она ( клавиша ) работает только когда активно мое приложение. Когда уводишь курсор на браузер в окно ввода, тискай - не тискай "горячую", а в буфере что было, то и осталось.
Давайте закроем тему. Это не вопрос жизненной необходимости.
min@y™

min@y™ (статус: Доктор наук), 8 апреля 2010, 12:04 [#8]:

Цитата (Толяныч):

Хоть она и горячая, но она ( клавиша ) работает только когда активно мое приложение.

Чтобы зарегистрировать горячую клавишу, ты, надеюсь использовал предназначенную для этого функцию RegisterHotkey()?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Толяныч

Толяныч (статус: 4-ый класс), 8 апреля 2010, 12:25 [#9]:

min@y™: И не надейся :-) Я довольствовался тем, что поставил амперсенд перед нужным символом в Caption, и пока приложение активно, этого было достаточно. Но теперь уж попробую, конечно.
min@y™

min@y™ (статус: Доктор наук), 8 апреля 2010, 12:45 [#10]:

Вот пример из моей проги.
При запуске:
  RegisterHotKey(Application.Handle, 253, MOD_CONTROL or MOD_WIN, VK_F12); // Ctrl + Win + F12
  RegisterHotKey(Application.Handle, 254, MOD_CONTROL or MOD_WIN, VK_F11); // Ctrl + Win + F11
RegisterHotKey(Application.Handle, 255, MOD_WIN, $20); // Win + Space
Перед выходом:
  UnregisterHotKey(Application.Handle, 253);
  UnregisterHotKey(Application.Handle, 254);
  UnregisterHotKey(Application.Handle, 255);
Отлов сообщений WM_HOTKEY:
procedure TMainForm.AppEventsMessage(var Msg: tagMSG;
  var Handled: Boolean);
begin
  case Msg.message of
    WM_QUERYENDSESSION: Close();
 
    WM_HOTKEY: begin
                 case Msg.wParam of
                   // Развернуть/активизировать
                   253: if IsIconic(Application.Handle)
                          then begin
                                 Application.Restore();
                                 Application.BringToFront();
                               end
                          else Application.Minimize();
 
                   // Сказать время
                   254: begin
                          Application.ProcessMessages();
                          Clocker.SpeakTime();
                        end;
 
                   // Отмена проигрывания
                   255: ThreadQueue.TerminateAllThreads();
                 end; // case
 
                 Handled:= False; // Отдаю другим прогам
               end;
  end; // case
 
  // ...
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 24 марта 2023, 19:52
Выполнено за 0.03 сек.
Рейтинг@Mail.ru