Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hook на системную клавишу, для PopUp Menu 
V
    Опции темы
Keeper89
Дата 30.3.2009, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Доброго времени суток!

На форме есть PopUp Menu. Необходимо установить хук на клавишу (или есть более рациональные способы?) вызова контекстного меню (та что правее пробела), при нажатии на которую меню будет закрываться.
Чем меньше кода и внешних библиотек, тем лучше.

Заранее спасибо.

Это сообщение отредактировал(а) Keeper89 - 30.3.2009, 21:52


--------------------
PM MAIL WWW   Вверх
Keeper89
Дата 31.3.2009, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Использую следующий код:
Код

...
var

  HookHandle: hHook;
  Form1: TForm1;

implementation

{$R *.dfm}

function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
var
  msg: PEVENTMSG;
begin

  if Code >= 0 then
  begin

    result := 0;

    msg := Pointer(LParam);

    with Form1 do begin
        Caption := IntTostr(msg.message);
        case msg.message of
            WM_KEYDOWN: 
              // Здесь надо перехватить клавишу контекстного меню

        end;
    end;

  end

  else
        result := CallNextHookEx(HookHandle, code, WParam, LParam);

end; 

procedure TForm1.FormCreate(Sender: TObject);
begin
  HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, HInstance, 0);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if HookHandle <> 0 then UnhookWindowsHookEx(HookHandle);
end;

Как здесь обработать клавишу контекстного меню?

Это сообщение отредактировал(а) Keeper89 - 31.3.2009, 19:40


--------------------
PM MAIL WWW   Вверх
kami
Дата 31.3.2009, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



GetAsyncKeyState и Virtual key codes
не помогут?
PM MAIL WWW   Вверх
Keeper89
Дата 31.3.2009, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Цитата(kami @  31.3.2009,  19:45 Найти цитируемый пост)
GetAsyncKeyState и Virtual key codes
не помогут? 

Да, спасибо, нашел нужный код клавиши.
VK_APPS (0x5D)
    Applications key (Natural keyboard)


--------------------
PM MAIL WWW   Вверх
Keeper89
Дата 31.3.2009, 20:55 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Дополнил код:
Код

function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
var
  msg: PEventMsg;
  VirtCode : byte;
  s: Char;
begin
  if Code >= 0 then
  begin
    result := 0;
    msg := Pointer(LParam);
    with Form1 do begin
        case msg.message of
            WM_KEYDOWN:
            begin
              VirtCode := msg^.paramL and $FF;
              Caption := IntTostr(VirtCode);
              if VirtCode = VK_APPS then
              begin
                SendMessage(PopupList.Window, WM_CANCELMODE, 0, 0);
                DestroyHook();
              end;
            end;
        end;
    end;
  end
  else
    result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;

Но меню не исчезает...


--------------------
PM MAIL WWW   Вверх
kami
Дата 1.4.2009, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



В сам код не вникал - не компенентен в вопросах меню, но:
1. где вызов CallNextHookEx в случае, если nCode>=0 ?
2. Вы уверены, что нужно именно SendMessage, а не PostMessage? Все-таки рекомендуется завершить работу процедуры хука как можно быстрее, а SendMessage ждет, пока оконная процедура не обработает отправленное сообщение. (а может, оконная процедура вообще не в состоянии обработать сообщение именно из-за отсутствия CallNextHookEx) ?
PM MAIL WWW   Вверх
Keeper89
Дата 1.4.2009, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Цитата(kami @  1.4.2009,  00:28 Найти цитируемый пост)
где вызов CallNextHookEx в случае, если nCode>=0

А зачем он, простите, нужен?
Цитата(kami @  1.4.2009,  00:28 Найти цитируемый пост)
Вы уверены, что нужно именно SendMessage, а не PostMessage? Все-таки рекомендуется завершить работу процедуры хука как можно быстрее, а SendMessage ждет, пока оконная процедура не обработает отправленное сообщение.

Ни одна, ни другая функция не приводят к результату.
Цитата(kami @  1.4.2009,  00:28 Найти цитируемый пост)
а может, оконная процедура вообще не в состоянии обработать сообщение именно из-за отсутствия CallNextHookEx

Поясните подробнее, ставил CallNextHookEx(...) до и после SendMessage - та же реакция.


Это сообщение отредактировал(а) Keeper89 - 1.4.2009, 00:48


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0462 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.