Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2012, 16:09   #1
c0mp
 
Регистрация: 27.11.2011
Сообщений: 9
Стрелка Послать нажатие клавиши + хуки

Я ставлю хук WH_CBT на определённый поток и мне нужно, когда одно из окон этого потока собирается развернутся (HCBT_MINMAX) послать ему нажатие клавиши F1. Я пробовал так (в CBTProc):
Код:
PostMessage(тут хэндл окна, WM_KEYDOWN, VK_F1, 0);
PostMessage(тут хэндл окна, WM_KEYUP, VK_F1, 0)
Не получается. Что я делаю не так?

UPD:
Вот код CBTProc
Код:
function CBTProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  W: WORD;
begin
  if nCode < 0 then Result:= CallNextHookEx(Hook, nCode, wParam, lParam)
  else begin
    if nCode = HCBT_MINMAX then
    begin
      W := lParam;
      if W = SW_SHOWNORMAL then
      begin
        PostMessage(wParam, WM_KEYDOWN, VK_F1, 0);
        PostMessage(wParam, WM_KEYUP, VK_F1, 0);
      end;
    end;
  end;
  Result := 0;
end;
При чём вот так работет:
Код:
function CBTProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  if nCode < 0 then Result:= CallNextHookEx(Hook, nCode, wParam, lParam)
  else begin
    PostMessage(wParam, WM_KEYDOWN, VK_F1, 0);
    PostMessage(wParam, WM_KEYUP, VK_F1, 0);
    Result := 0;
  end;
end;
Почему?

Последний раз редактировалось c0mp; 12.08.2012 в 16:57.
c0mp вне форума Ответить с цитированием
Старый 12.08.2012, 16:54   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Начнём с того, что lParam для WM_KEYUP не может быть равен 0, согласно MSDN; хотя вряд ли это на что-то влияет. Возможно, не тому окну посылаешь. Посмотри, какие сообщения какому окну приходят при реальном нажатии F1 и приходят ли эти KEYDOWN/KEYUP из хука тому же окну.
Somebody вне форума Ответить с цитированием
Старый 12.08.2012, 17:28   #3
c0mp
 
Регистрация: 27.11.2011
Сообщений: 9
По умолчанию

KEYDOWN/KEYUP приходят во всех трёх случаях: первый вариант функции CBTProc, второй, и реальное нажатие клавиши. Но в окно, в итоге F1 "доходит" только в пером и третьем.
c0mp вне форума Ответить с цитированием
Старый 12.08.2012, 17:43   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Вы всетаки посмотрите с каким LPARAM приходят сообщения когда нажимаете "настоящую" клавишу и попробуйте передать то же самое
waleri вне форума Ответить с цитированием
Старый 12.08.2012, 18:05   #5
c0mp
 
Регистрация: 27.11.2011
Сообщений: 9
По умолчанию

Не помогло
c0mp вне форума Ответить с цитированием
Старый 12.08.2012, 18:56   #6
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

У первого варианта в конце Result := 0 вне всяких if'ов, так что, думаю, нажатие доходит, но при создании окна хелпа (F1 - help, как я понимаю) вызывается этот хук с кодом HCBT_CREATEWND, который запрещает создание окна.
Somebody вне форума Ответить с цитированием
Старый 13.08.2012, 06:39   #7
c0mp
 
Регистрация: 27.11.2011
Сообщений: 9
По умолчанию

Цитата:
нажатие доходит
Да, смотрел в Spy++, сообщения WM_KEYDOWN/WM_KEYUP доходят.

Цитата:
F1 - help, как я понимаю
Нет, я делаю что-то вроде робота для отбора карт для покера. Когда подходит моё слово (нужно сделать фолд, колл или рейз) окно разворачивается. И там есть функция, что можно вместо нажатия кнопок в окне, нажимать F1, F2, F3. (фолд, колл, рейз). Вот я и ставлю хук WH_CBT, смотрю когда nCode HCBT_MINMAX и если младшее слово lParam SW_SHOWNORMAL, то в зависимости от карты (смотрю в чате) я хочу или послать F1 и сделать Result := 1 (сбросить карты и не дать окну развернуться) или если карта хорошая Result := 0 (дать окну развернутся)

Пробовал посылать также F2. В Spy++ видно, сообщения доходят, а в окне ничего не происходит.
c0mp вне форума Ответить с цитированием
Старый 13.08.2012, 10:26   #8
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Хм... Если это покер, тогда, может быть, в нём защита от таких действий? Например, он сам себе ставит хук и через него уже все нажатия клавиш определяет. Тогда WM_KEYDOWN его как-то не очень волнует.
Somebody вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Послать нажатие кнопки в игру (Warcraft) TwiX Общие вопросы Delphi 6 20.05.2010 17:46
Как послать в систему сообщение о нажатии клавиши? Gerzs Общие вопросы Delphi 7 24.10.2009 19:19
Как послать нажатие кнопки? И вопрос про хук клавы. TwiX Общие вопросы Delphi 22 11.09.2009 19:14
Долгое нажатие клавиши в KeyDown как одно нажатие marina15056 Общие вопросы Delphi 7 16.08.2009 00:22
Как послать Edit'у сообщение о нажатии клавиши Vadik(R) Общие вопросы Delphi 4 27.12.2008 20:38