purebasic.info

PureBasic forum
Текущее время: Пн ноя 19, 2018 12:30 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Отловить нажатие клавиш F1-F11
СообщениеДобавлено: Пн мар 17, 2014 1:09 pm 
Не в сети
доцент

Зарегистрирован: Ср сен 12, 2012 5:04 am
Сообщений: 56
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Всем привет!
Пытаюсь "научить" программу выполнять Действие при нажатии на клавишу F1.
Т.е. нужно отлавливать станартные нажатия кнопок (кнопки нарисовал я) + нажатия функциональных клавиш.

Поскажите, пожалуйста.
Раньше было через goto (избавляюсь от goto):
Код:
1
2
3
 
If GetAsyncKeyState_(#VK_F1)= -32767
Goto metka


Сейчас бы как-то так хотелось (может не верно понимаю логику- то направьте в нужную сторону, пните, так сказать):
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
Open_Window()
Repeat
   Event  = WaitWindowEvent()
   Gadget = EventGadget()
   Type   = EventType()
Select Event
Case #PB_Event_Gadget
     Select Gadget
                  Case 1
                  debug Test
                           Case F1
                           debug F1
                  EndSelect
     EndSelect
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Отловить нажатие клавиш F1-F11
СообщениеДобавлено: Пн мар 17, 2014 1:24 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11325
Благодарил (а): 4 раз.
Поблагодарили: 440 раз.
Используй цикл.
Код:
1
2
3
4
5
6
7
For i=1 To 12
  If GetAsyncKeyState_(#VK_F1+i-1)= -32767
    Debug "Нажата F"+i
  Else
    Debug "Не нажата F"+i
  EndIf
Next


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Отловить нажатие клавиш F1-F11
СообщениеДобавлено: Пн мар 17, 2014 2:09 pm 
Не в сети
доцент

Зарегистрирован: Ср сен 12, 2012 5:04 am
Сообщений: 56
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
[quote="Пётр"][/quote], не могу понять по какому условию "провалиться" в выборку, где буу отлавливать
Код:
1
GetAsyncKeyState_(#VK_F1)= -32767

..


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Отловить нажатие клавиш F1-F11
СообщениеДобавлено: Пн мар 17, 2014 2:23 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Код:
1
2
3
4
5
6
7
8
9
Repeat
  For i=1 To 12
    If GetAsyncKeyState_(#VK_F1+i-1)= -32767
      Debug "Нажата F"+i
      ;Тут выполняем нужные действия, например, прерываем основной цикл
      Break 2
    EndIf
  Next
ForEver


_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Отловить нажатие клавиш F1-F11
СообщениеДобавлено: Пн мар 17, 2014 3:01 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Никита Однороб писал(а):
Код:
1
2
3
4
5
6
7
8
9
Repeat
  For i=1 To 12
    If GetAsyncKeyState_(#VK_F1+i-1)= -32767
      Debug "Нажата F"+i
      ;Тут выполняем нужные действия, например, прерываем основной цикл
      Break 2
    EndIf
  Next
ForEver


Этот код сожрет все процессорное время. Лучше делать через колбек ф-ию
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Procedure WinCallback(hWnd, uMsg, WParam, LParam) 
       If uMsg = #WM_KEYDOWN
      For i=1 To 12
      If GetAsyncKeyState_(#VK_F1+i-1)= -32767
        Debug "Нажата F"+i
      ;Тут выполняем нужные действия, например, прерываем основной цикл
        Break
      EndIf
    Next
    EndIf  
 
    ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
 
  If OpenWindow(0, 0, 0, 200, 100, "Messages", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
   
    SetWindowCallback(@WinCallback())    ; activate the callback
   
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          End
      EndSelect
    ForEver
  EndIf
 


_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Отловить нажатие клавиш F1-F11
СообщениеДобавлено: Пн мар 17, 2014 3:57 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11325
Благодарил (а): 4 раз.
Поблагодарили: 440 раз.
pablov писал(а):
Лучше делать через колбек ф-ию
Тогда зачем GetAsyncKeyState если можно без нее?
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Procedure WinCallback(hWnd, uMsg, WParam, LParam) 
 
  If uMsg = #WM_KEYDOWN
    If wParam>=#VK_F1 And wParam<=#VK_F12
      Debug "Нажата F"+Str(wParam-#VK_F1+1)
    EndIf
  EndIf  
 
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
 
If OpenWindow(0, 0, 0, 200, 100, "Messages", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
 
  SetWindowCallback(@WinCallback())    ; activate the callback
 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf

Или зачем колбек если есть AddKeyboardShortcut()?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Отловить нажатие клавиш F1-F11
СообщениеДобавлено: Пн мар 17, 2014 7:10 pm 
Не в сети
профессор

Зарегистрирован: Вт янв 13, 2009 2:41 pm
Сообщений: 370
Благодарил (а): 3 раз.
Поблагодарили: 17 раз.
Пункты репутации: 8
AddKeyboardShortcut() пользовал одно время, поставил на пробел, так в том окне пробел работал только как горячая клавиша, а как пробел не работал.
Если горячие клавиши должны срабатывать только когда окно активно, можно использовать оконный колбэк, если горячие клавиши должны отрабатывать всегда, тогда лучше поставить таймер (SetTimer_()), или создать поток с бесконечным циклом и задержкой (Delay()), чтоб поток не наглел, отнимая большую часть процессорного времени.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Отловить нажатие клавиш F1-F11
СообщениеДобавлено: Пн мар 17, 2014 9:02 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Пётр писал(а):
pablov писал(а):
Лучше делать через колбек ф-ию
Тогда зачем GetAsyncKeyState если можно без нее?

Тоже верно.
У меня ни мой код, ни код Петра не отлавливает нажатие клавиши F10. Пробовал на двух компах (win xp sp3 и win 7 x64). Интересно, где косяк

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Отловить нажатие клавиш F1-F11
СообщениеДобавлено: Вт мар 18, 2014 1:37 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 777
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 12 раз.
Пункты репутации: 0
Цитата:
У меня ни мой код, ни код Петра не отлавливает нажатие клавиши F10
Подтверждаю.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Отловить нажатие клавиш F1-F11
СообщениеДобавлено: Вт мар 18, 2014 1:49 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Цитата:
У меня ни мой код, ни код Петра не отлавливает нажатие клавиши F10
Windows 8 x64, подтверждаю. А всё вот почему:
Цитата:
WM_SYSKEYDOWN message
Posted to the window with the keyboard focus when the user presses the F10 key (which activates the menu bar) or holds down the ALT key and then presses another key. It also occurs when no window currently has the keyboard focus; in this case, the WM_SYSKEYDOWN message is sent to the active window. The window that receives the message can distinguish between these two contexts by checking the context code in the lParam parameter.
Вот отлавливает все функциональные клавиши, включая F10
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Procedure WinCallback(hWnd, uMsg, WParam, LParam) 
 
  If uMsg = #WM_KEYDOWN Or uMsg = #WM_SYSKEYDOWN
    If wParam>=#VK_F1 And wParam<=#VK_F12
      Debug "Нажата F"+Str(wParam-#VK_F1+1)
    EndIf
  EndIf  
 
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
 
If OpenWindow(0, 0, 0, 200, 100, "Messages", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
 
  SetWindowCallback(@WinCallback())    ; activate the callback
 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf


_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Отловить нажатие клавиш F1-F11
СообщениеДобавлено: Вт мар 18, 2014 1:53 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 777
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 12 раз.
Пункты репутации: 0
Цитата:
У меня ни мой код, ни код Петра не отлавливает нажатие клавиши F10
Подтверждаю.
А это что значить?
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Procedure WinCallback(hWnd, uMsg, WParam, LParam)
    If GetAsyncKeyState_(#VK_F10)
       Debug wParam
    EndIf
     
     
      If uMsg = #WM_KEYDOWN
        ;Debug wParam
        If wParam>=#VK_F1 And wParam<=#VK_F12
          Debug "Нажата F"+Str(wParam-#VK_F1+1)
        EndIf
      EndIf
     
      ProcedureReturn #PB_ProcessPureBasicEvents
    EndProcedure
 
    If OpenWindow(0, 0, 0, 200, 100, "Messages", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
     
      SetWindowCallback(@WinCallback())    ; activate the callback
     
      Repeat
       
     
        Select WaitWindowEvent()
          Case #PB_Event_CloseWindow
            End
        EndSelect
      ForEver
    EndIf


Вот так нажимается F10
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    Procedure WinCallback(hWnd, uMsg, WParam, LParam)
   
      If uMsg = #WM_SYSKEYDOWN;WM_KEYDOWN
        ;Debug wParam
        If wParam>=#VK_F1 And wParam<=#VK_F12
          Debug "Нажата F"+Str(wParam-#VK_F1+1)
        EndIf
      EndIf
     
      ProcedureReturn #PB_ProcessPureBasicEvents
    EndProcedure
 
    If OpenWindow(0, 0, 0, 200, 100, "Messages", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
     
      SetWindowCallback(@WinCallback())    ; activate the callback
     
      Repeat
       
     
        Select WaitWindowEvent()
          Case #PB_Event_CloseWindow
            End
        EndSelect
      ForEver
    EndIf


по моему это баг


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Отловить нажатие клавиш F1-F11
СообщениеДобавлено: Вт мар 18, 2014 2:42 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Никита Однороб писал(а):
Вот отлавливает все функциональные клавиши, включая F10

Не все. F11 и F12 не ловит (win xp sp3)

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Отловить нажатие клавиш F1-F11
СообщениеДобавлено: Вт мар 18, 2014 2:44 pm 
Не в сети
профессор

Зарегистрирован: Пн янв 03, 2011 4:27 pm
Сообщений: 412
Благодарил (а): 5 раз.
Поблагодарили: 17 раз.
Пункты репутации: 0
mestnyi, нет скорей ограничение, о нем известно с версий 4.61, вот ссылка http://www.purebasic.fr/english/viewtop ... 13&t=49151
http://vsokovikov.narod.ru/New_MSDN_API ... eydown.htm
Цитата:
F10
In Microsoft Windows activates the menu bar of an open application.
Shift + F10 is the same as right-clicking on a highlighted icon, file, or Internet link.
Access the hidden recovery partition on HP and Sony computers.
Enter CMOS Setup.
With Mac OS 10.3 or later shows all open Windows for active program.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Отловить нажатие клавиш F1-F11
СообщениеДобавлено: Вт мар 18, 2014 5:38 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
pablov писал(а):
Никита Однороб писал(а):
Вот отлавливает все функциональные клавиши, включая F10

Не все. F11 и F12 не ловит (win xp sp3)
Странно. На восьмерке ловит :?

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Отловить нажатие клавиш F1-F11
СообщениеДобавлено: Вт мар 18, 2014 5:51 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
на win 7 x64 не ловит

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB