Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PowerBuilder Новый топик    Ответить
 Как отловить нажатие клавиши Win в DW?  [new]
Anton Losev
Member

Откуда:
Сообщений: 11
Не удается отловить нажатие клавиши Win (RWin, LWin) в datawindow.
Пробовал в событии other datawindow обработать WM_KEYDOWN
if message.number = 256 then //WM_KEYDOWN
  if wparam = 91 or wparam = 91 then 
    ...
  end if
end if
Такое впечатление, что это сообщение обрабатывается еще раньше, потому что условие message.number = 256 никогда не выполняется, хотя Spy++ показывает вот что:
<00162> 001F0CF0 P WM_KEYDOWN nVirtKey:VK_LWIN cRepeat:1 ScanCode:5B fExtended:1 fAltDown:0 fRepeat:0 fUp:0
С WM_SYSKEYDOWN тот же результат.
Пробовал в обработчике pbm_dwnkey использовать функции GetKeyState и GetAsyncKeyState, чтобы считать состояние клавиш Win. Первая почти всегда возвращают 1 для RWin даже в том случае, если она не была нажата, а для возвращает всегда 1 после первого нажатия. Вторая возвращает всегда 0.
Что делать?
12 ноя 09, 16:36    [7921751]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
spas2001
Member

Откуда: Тамбов--->Москва-->Тамбов-->Москва-->Тамбов
Сообщений: 2010
Смапируй событие в dw pbm_dwnkey и все будет хорошо
-----------------------------------------------------------------------------
Главная деталь любой машины - голова ее владельца
12 ноя 09, 16:42    [7921799]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
spas2001
Member

Откуда: Тамбов--->Москва-->Тамбов-->Москва-->Тамбов
Сообщений: 2010
Извиняюсь, поторопился
Что писал в pbm_dwnkey?
Если тот код, что выше, то он там работать не будет
-----------------------------------------------------------------------------
Главная деталь любой машины - голова ее владельца
12 ноя 09, 16:45    [7921819]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
spas2001
Member

Откуда: Тамбов--->Москва-->Тамбов-->Москва-->Тамбов
Сообщений: 2010
Коды этого диапазона не обрабатываются
KeyDown only detects ASCII values 65-90 (KeyA! - KeyZ!) and 48-57 (Key0!-Key9!). 
These ASCII values detect whether the key was pressed, whether or not the user also pressed Shift or Caps Lock. 
KeyDown does not detect other ASCII values (such as 97-122 for lowercase letters).
-----------------------------------------------------------------------------
Главная деталь любой машины - голова ее владельца
12 ноя 09, 16:54    [7921867]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
Anton Losev
Member

Откуда:
Сообщений: 11
spas2001, то, что в обработчике pbm_dwnkey как и в pmb_keydown напрямую проверить по keycode нажатие RWin или LWin нельзя, я знаю. Тем не менее, это нужно как-то сделать. Почему pbm_other для datawindow стандартным образом не обрабатывается - вот что непонятно.
12 ноя 09, 17:08    [7921940]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
Филипп
Member

Откуда: Boston, MA, USA (c 1989 ) б. Москва
Сообщений: 1880
Тут всё неоднозначно. Если у вас DW НЕ editable, то всё отрабатывает, DW получает WM_KEYDOWN с VK_L(R)WIN.
Если DW editable и фокус в редактируемой колонке, то Edit Control, а НЕ DW получает WM_KEYDOWN, но никаких notifications в DW не посылает (В него только EN_KILLFOCUS через WM_COMMAND приходит и всё).
Но самое главное - ЗАЧЕМ вам это?
12 ноя 09, 21:29    [7922882]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
Anton Losev
Member

Откуда:
Сообщений: 11
Есть хитрый userobject - поле ввода, при наведении мыши на который открывается всплывающее дочернее окно с editable datawindow внутри. Это окошко фиксируется на экране, если на него кликнуть и убирается, если увести мышь с поля ввода или с самого окошка. Нужно, не привязываясь к обработчикам событий родительских окон (т.е. тех, на которых будут размещаться userobjects), правильно обрабатывать "деактивацию" приложения - закрывать окошко при переключении на другое приложение. Все работает хорошо за исключением случаев, когда другие приложения запускаются с помощью системных горячих клавиш (Win+Break, например). Вот я и пытаюсь отлавливать эти нажатия - по-просту закрывать окошко, когда пользователь нажимает на Ctrl, Alt, Win.
13 ноя 09, 10:53    [7924291]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
Anton Losev
Member

Откуда:
Сообщений: 11
Филипп, под editable подразумевается DisplayOnly для поля?
13 ноя 09, 11:47    [7924802]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
spas2001
Member

Откуда: Тамбов--->Москва-->Тамбов-->Москва-->Тамбов
Сообщений: 2010
Может все-таки деактивацию вылавливать чем все кнопки
-----------------------------------------------------------------------------
Главная деталь любой машины - голова ее владельца
13 ноя 09, 13:04    [7925491]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
Anton Losev
Member

Откуда:
Сообщений: 11
spas2001, кнопок-то 3 штуки, а форм, на которых будет размещаться uo - сколько угодно и для каждой прописывать deactivate неудобно.
13 ноя 09, 13:24    [7925696]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
Anton Losev
Member

Откуда:
Сообщений: 11
Так уж и быть, повешу на deactivate главной формы. Раз уж отловить win в dw не получается.
13 ноя 09, 14:55    [7926511]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
VanoR
Member

Откуда: оттуда
Сообщений: 711
попробовал у себя в pbm_dwnkey
if KeyDown( KeyLeftWindows! ) then messagebox('','')
нормально отрабатывает
с правым Win не пробовал, так как у меня на буке его нету :)
13 ноя 09, 15:22    [7926610]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
spas2001
Member

Откуда: Тамбов--->Москва-->Тамбов-->Москва-->Тамбов
Сообщений: 2010
Дело в том что если стоит какая-то прога типа перекодировщика на-лету может и не отрабатывать
-----------------------------------------------------------------------------
Главная деталь любой машины - голова ее владельца
13 ноя 09, 16:59    [7927564]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
VanoR
Member

Откуда: оттуда
Сообщений: 711
ну если только перекодировщик на лету (не знаю че эт такое.... если Punto, то у меня стоит и нормально все)
то и все остальное в pbm_dwnkey тоже перестанет работать
13 ноя 09, 17:10    [7927676]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
Филипп
Member

Откуда: Boston, MA, USA (c 1989 ) б. Москва
Сообщений: 1880
Anton Losev
Филипп, под editable подразумевается DisplayOnly для поля?

Подразумевается что фокус в Datawindow, но НЕ в edit controle Datawindow...
13 ноя 09, 18:27    [7928104]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
Филипп
Member

Откуда: Boston, MA, USA (c 1989 ) б. Москва
Сообщений: 1880
VanoR
попробовал у себя в pbm_dwnkey
if KeyDown( KeyLeftWindows! ) then messagebox('','')
нормально отрабатывает
с правым Win не пробовал, так как у меня на буке его нету :)

Если фокус в Datawindow, но НЕ в edit controle Datawindow, то сработает, иначе - нет...
13 ноя 09, 18:30    [7928109]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
Anton Losev
Member

Откуда:
Сообщений: 11
Здорово, не знал про KeyLeftWindows!
Спасибо всем, по-моему ответы теперь довольно исчерпывающи.
16 ноя 09, 10:11    [7932023]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как отловить нажатие клавиши Win в DW?  [new]
boogiman
Member [заблокирован]

Откуда:
Сообщений: 2558
Подниму тему:

Есть форма , в ней dw с редактируемыми полями. Внизу есть кнопки типа Сохранить.
Пользователь хочет навесить алгоритм, чтобы при нажатии F12 - отрабатывал вызов кнопки Сохранить...

На форме это работает без проблем:

if keydown (KeyF12!) then
cb_save_add.event clicked()
end if

А вот на dw даже на событии pm_dwnkey , нет потому как курсор горит в фокусе одного из полей.
Message.number тоже не особо помог.
Проблема имеет решение, если да то поделитесь плиз!
PowerBuilder 9.0
Спасибо...
15 дек 11, 14:16    [11771109]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
spas2001
Member

Откуда: Тамбов--->Москва-->Тамбов-->Москва-->Тамбов
Сообщений: 2010
Через ChangeMenu привесить меню, но не отображать
Туда прописать hotkey F12
Должно сработать
15 дек 11, 17:34    [11773546]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
Филипп
Member

Откуда: Boston, MA, USA (c 1989 ) б. Москва
Сообщений: 1880
boogiman
Подниму тему:

Есть форма , в ней dw с редактируемыми полями. Внизу есть кнопки типа Сохранить.
Пользователь хочет навесить алгоритм, чтобы при нажатии F12 - отрабатывал вызов кнопки Сохранить...

На форме это работает без проблем:

if keydown (KeyF12!) then
cb_save_add.event clicked()
end if

А вот на dw даже на событии pm_dwnkey , нет потому как курсор горит в фокусе одного из полей.
Спасибо...

У меня на событии pm_dwnkey , когда курсор горит в фокусе одного из полей, срабатывает на раз:
IF key = KeyF12! THEN
	MessageBox("Yes", "KeyF12!")
END IF
15 дек 11, 21:20    [11774951]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
boogiman
Member [заблокирован]

Откуда:
Сообщений: 2558
Филипп
У меня на событии pm_dwnkey , когда курсор горит в фокусе одного из полей, срабатывает на раз:
IF key = KeyF12! THEN
	MessageBox("Yes", "KeyF12!")
END IF


Попробовал не работает, у меня обычный тип dw - может быть у вас , как то другой тип или оции на ячейках стоят какие то хитрые?
16 дек 11, 08:23    [11775702]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
boogiman
Member [заблокирован]

Откуда:
Сообщений: 2558
spas2001
Через ChangeMenu привесить меню, но не отображать
Туда прописать hotkey F12
Должно сработать


Это если честно не понял, как это сделать? Меню для dw или для window?
Просто ни разу такого не делал!
16 дек 11, 08:30    [11775719]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
spas2001
Member

Откуда: Тамбов--->Москва-->Тамбов-->Москва-->Тамбов
Сообщений: 2010
Меню конечно для окна
Где-нибудь в Open - changemenu(m_menu)
Даже в респонсе работает.
Но странно что pbm_dwnkey не отрабатывает
16 дек 11, 17:19    [11779466]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить нажатие клавиши Win в DW?  [new]
Филипп
Member

Откуда: Boston, MA, USA (c 1989 ) б. Москва
Сообщений: 1880
boogiman
Филипп
У меня на событии pm_dwnkey , когда курсор горит в фокусе одного из полей, срабатывает на раз:
IF key = KeyF12! THEN
	MessageBox("Yes", "KeyF12!")
END IF


Попробовал не работает, у меня обычный тип dw - может быть у вас , как то другой тип или оции на ячейках стоят какие то хитрые?


Абсолютно стандартное всё.
16 дек 11, 20:26    [11780394]     Ответить | Цитировать Сообщить модератору
Все форумы / PowerBuilder Ответить