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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2009, 10:53   #1
Someb7
Новичок
Джуниор
 
Регистрация: 07.04.2009
Сообщений: 2
По умолчанию Как сразу после WM_KEYDOWN отправить WM_KEYUP ?

Привет!

Заменяю вращение колеса мышки на нажатие клавиши по стандартному методу:

Код:
procedure Tfopt.AppMessage(var Msg: TMsg; var Handled: Boolean);
var i: ShortInt;
begin

if Msg.message= WM_MOUSEWHEEL then // при получении сообщения о прокрутке
  begin
   Msg.lParam:=0;  i:=HiWord(Msg.wParam);
   if i>0  then Msg.wParam:=VK_UP   else  Msg.wParam:=VK_DOWN; 
   Msg.message:=WM_KEYDOWN;  //...оно подменяется сообщением о нажатии клавиши
   Handled:=false;
   end;

end;
Все работает, но на форме есть компонент UpDown, которому надо еще после WM_KEYDOWN отправить WM_KEYUP

Есть какие-нибудь решения как сразу после WM_KEYDOWN отправить WM_KEYUP ?
Someb7 вне форума Ответить с цитированием
Старый 17.10.2009, 13:02   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Send/PostMessage
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.10.2009, 21:50   #3
Someb7
Новичок
Джуниор
 
Регистрация: 07.04.2009
Сообщений: 2
По умолчанию

Так и сделал:
Код:
procedure Tfopt.AppMessage(var Msg: TMsg; var Handled: Boolean);
var i: ShortInt; keydn_: LongInt;
begin
if Msg.message= WM_MOUSEWHEEL then // при получении сообщения о прокрутке
  begin
   Msg.lParam:=0;  i:=HiWord(Msg.wParam);
   if i>0  then Msg.wParam:=VK_UP   else Msg.wParam:=VK_DOWN;
   Msg.message:=WM_KEYDOWN;  //...оно подменяется сообщением о нажатии клавиши
//
// Prevent uncorrect work of corespond UpDown
   if ActiveControl=Edit1 then
      while PostMessage( Edit1.Handle,WM_KEYUP,Msg.wParam,0 ) <> true do ;
   if ActiveControl=Edit3 then
      while PostMessage( Edit3.Handle,WM_KEYUP,Msg.wParam,0 ) <> true do ;
   if ActiveControl=Edit5 then
      while PostMessage( Edit5.Handle,WM_KEYUP,Msg.wParam,0 ) <> true do ;
   if ActiveControl=Edit4 then
      while PostMessage( Edit4.Handle,WM_KEYUP,Msg.wParam,0 ) <> true do ;
// 
   Handled:=false;
  end;
end;
Без строчек с PostMessage получается так (см.рис.), т.е. после прокручивания одного поля ввода и перехода к другому остаются выделенные синим цветом кнопки вверх (или вниз) компонента UpDown, которые убираются посылом WM_KEYUP.

Теперь правда с добавлением этих строчек выделения синим цветом нет вообще, хотя в поля Edit посылаются сначала WM_KEYDOWN, а потом WM_KEYUP - полная иммитация нажатия клавиши. Но этот вариант устраивает больше.
Изображения
Тип файла: png ris1.png (1.9 Кб, 47 просмотров)
Someb7 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запуск программы сразу после открытия папки artemavd Общие вопросы Delphi 16 25.08.2009 08:41
Как выделить несколько листов сразу? frantic150 Microsoft Office Excel 3 25.06.2009 01:25
Обработка wm_keydown если на форме присутствует TFrame Oburec Компоненты Delphi 1 13.04.2009 10:01
delphi7 программа после компиляции сразу закрывается fredd Помощь студентам 1 30.10.2008 14:25
консоль закрывается сразу после выполнения последнего действия F4RR3LL Общие вопросы C/C++ 2 14.09.2008 20:43