PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Перехват нажатий кнопок и снятие скриншотов


Перехват нажатий кнопок и снятие скриншотов

Сообщений 1 страница 19 из 19

1

2 вопроса:
1)как совершить действие по нажатию клавиши (в данном случае меня интересует как при нажатии принт скрин сделать снимок всего экрана)
2)вытекает из первого: как сделать снимок экрана
PS: примеры смотрел: в одном с использованием библиотек, в другом не понятно ничего было

0

2

Этот пример смотрел http://pure-basic.narod.ru/project/skrinhot.html
Там как раз снимается скрин всего экрана, при нажатии PrintScreen и скрин активного окна, при нажатии Ctrl + PrintScreen.

0

3

Смотрел, вот как раз здесь и не понял. Например ни разу не видел этой записи:Event=HotkeyWaitWindowEvent() обычно же пишут Event=WaitWindowEvent() И что то я тут не увидел, где происходит отслеживание этого нажатия

0

4

daiomik написал(а):

Например ни разу не видел этой записи:Event=HotkeyWaitWindowEvent()

Это функция из библиотеки Hotkey (установка хука (перехвата) на кнопки клавиатуры).

daiomik написал(а):

И что то я тут не увидел, где происходит отслеживание этого нажатия

Там есть функции регистрации хуков на кнопки  - HotKeyAdd
В них указывается какие процедуры нужно вызывать при нажатии кнопок.

Вот пример, думаю что все станет понятно.

Код:
Procedure CreateSkrinAll()
   MessageRequester("", "Нажата кнопка PrintScreen")
EndProcedure

Procedure CreateSkrinWindow()
   MessageRequester("", "Нажаты кнопки Ctrl + PrintScreen")
EndProcedure

OpenWindow(0, 0, 0, 100, 80, "Окно",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )

HotKeysInit() ; Инициализация библиотеки HotKeys
HotKeyAdd(WindowID(0), 44, @CreateSkrinAll(), "SkrinAll", 0,0,0)    ; Перехват кнопки PrintScreen
HotKeyAdd(WindowID(0), 44, @CreateSkrinWindow(), "SkrinWin", 0,0,1) ; Перехват сочетания кнопок Ctrl + PrintScreen

Repeat
 Event=HotkeyWaitWindowEvent()

Until Event=#PB_Event_CloseWindow

Описание функций ищем в справке Друпии.
Для этого, просто ставим текстовый курсор на имя функции и жмем F1

0

5

На много стало понятней...но не вижу тут PrintScreen и Ctrl + PrintScreen.. А если мне нужно событие на другую клавишу  назначить?

0

6

44 - код кнопки PrintScreen.
3 последних аргумента - состояние кнопок shift, alt и control. 0 - кнопка не контроллируется; 1 - событие произойдёт только после нажатия кнопки.

Для возникновения события, нужно нажать на 2 + alt + control

Код:
#shift   = 0 ; Состояние кнопки не учитывается
#alt     = 1 ; Должна быть надата
#control = 1 ; Должна быть надата

Procedure CreateSkrinAll()
   MessageRequester("", "Нажаты кнопки 2 + alt + control")
EndProcedure

OpenWindow(0, 0, 0, 100, 80, "Окно",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )

HotKeysInit() ; Инициализация библиотеки HotKeys
HotKeyAdd(WindowID(0), #VK_2, @CreateSkrinAll(), "SkrinAll", #shift,#alt,#control)

Repeat
 Event=HotkeyWaitWindowEvent()

Until Event=#PB_Event_CloseWindow

0

7

Спасибо!

0

8

Вот простейшая программа, снимающая скрины всего экрана (кнопка PrintScreen) или активного окна (кнопки Ctrl + PrintScreen).
Скрины сохраняются в корне диска C:, в виде рисунков формата PNG.

Код:
UsePNGImageEncoder() ; Поддержка сохренения рисунков в PNG формате

Procedure CreateSkrinAll()
 CaptureFullScreen() ; Создание скриншота всего экрана
 SaveCapture("C:\SkrinAll.png",#PB_ImagePlugin_PNG,0) ; Сохренение скриншота в виде рисунка в формате png
EndProcedure

Procedure CreateSkrinWindow()
  CaptureWindow(ForegroundWindowGet()) ; Создание скрина активного окна
  SaveCapture("C:\SkrinWindow.png",#PB_ImagePlugin_PNG,0) ; Сохренение скриншота в виде рисунка в формате png
EndProcedure

OpenWindow(0, 0, 0, 100, 80, "Окно",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
HotKeysInit() ; Инициализация библиотеки HotKeys
HotKeyAdd(WindowID(0), 44, @CreateSkrinAll(), "SkrinAll", 0,0,0)    ; Перехват кнопки PrintScreen
HotKeyAdd(WindowID(0), 44, @CreateSkrinWindow(), "SkrinWin", 0,0,1) ; Перехват сочетания кнопок Ctrl + PrintScreen

Repeat
 Event=HotkeyWaitWindowEvent()
Until Event=#PB_Event_CloseWindow

0

9

Все доходчиво и ясно. А как узнать номера этих клавиш? Как я пойму на какой номер соответствует W

0

10

daiomik написал(а):

А как узнать номера этих клавиш? Как я пойму на какой номер соответствует W

У этой кнопки код $57

Код:
Следующая таблица содержит имена символьных констант
шестнадцетеричные значения, и эквиваленты виртуальных кодов 
клавиш для мышки и клавиатуры используемые системой 
Коды внесены в таблицу по порядку нумерации. 

Символьное имя константы Значение
(hexadecimal) Эквивалент клавиатуры или мышки 
VK_LBUTTON 01 Левая кнопка мыши  
VK_RBUTTON 02 Правая кнопка мыши  
VK_CANCEL 03 Обработка Control-break  
VK_MBUTTON 04 Средняя кнопка мыши (трех-кнопочная мышьe)  
VK_XBUTTON1 05 Windows 2000: X1 кнопка мыши 
VK_XBUTTON2 06 Windows 2000: X2 кнопка мыши 
—  07 Неопределена  
VK_BACK 08 BACKSPACE клавиша  
VK_TAB 09 TAB клавиша  
—  0A–0B Зарезервировано  
VK_CLEAR 0C CLEAR клавиша  
VK_RETURN 0D ENTER клавиша  
—  0E–0F Неопределена  
VK_SHIFT 10 SHIFT клавиша  
VK_CONTROL 11 CTRL клавиша  
VK_MENU 12 ALT клавиша  
VK_PAUSE 13 PAUSE клавиша  
VK_CAPITAL 14 CAPS LOCK клавиша  
VK_KANA 15 IME Kana режим 
VK_HANGUEL 15 IME Hanguel режим (Поддерживается для совместимости; используйте VK_HANGUL) 
VK_HANGUL 15 IME Hangul режим 
—  16 Неопределена  
VK_JUNJA 17 IME Junja режим 
VK_FINAL 18 IME final режим 
VK_HANJA 19 IME Hanja режим 
VK_KANJI 19 IME Kanji режим 
—  1A Неопределена  
VK_ESCAPE 1B ESC клавиша  
VK_CONVERT 1C IME конвертировать 
VK_NONCONVERT 1D IME не конвертировать 
VK_ACCEPT 1E IME принять 
VK_MODECHANGE 1F IME режим изменения запроса 
VK_SPACE 20 SPACEBAR  
VK_PRIOR 21 PAGE UP клавиша  
VK_NEXT 22 PAGE DOWN клавиша  
VK_END 23 END клавиша  
VK_HOME 24 HOME клавиша  
VK_LEFT 25 LEFT ARROW клавиша  
VK_UP 26 UP ARROW клавиша  
VK_RIGHT 27 RIGHT ARROW клавиша  
VK_DOWN 28 DOWN ARROW клавиша  
VK_SELECT 29 SELECT клавиша  
VK_PRINT 2A PRINT клавиша 
VK_EXECUTE 2B EXECUTE клавиша  
VK_SNAPSHOT 2C PRINT SCREEN клавиша  
VK_INSERT 2D INS клавиша  
VK_DELETE 2E DEL клавиша  
VK_HELP 2F HELP клавиша  
 30 0 клавиша  
 31 1 клавиша  
 32 2 клавиша  
 33 3 клавиша  
 34 4 клавиша  
 35 5 клавиша  
 36 6 клавиша  
 37 7 клавиша  
 38 8 клавиша  
 39 9 клавиша  
—  3A–40 Неопределена  
 41 A клавиша  
 42 B клавиша  
 43 C клавиша  
 44 D клавиша  
 45 E клавиша  
 46 F клавиша  
 47 G клавиша  
 48 H клавиша  
 49 I клавиша  
 4A J клавиша  
 4B K клавиша  
 4C L клавиша  
 4D M клавиша  
 4E N клавиша  
 4F O клавиша  
 50 P клавиша  
 51 Q клавиша  
 52 R клавиша  
 53 S клавиша  
 54 T клавиша  
 55 U клавиша  
 56 V клавиша  
 57 W клавиша  
 58 X клавиша  
 59 Y клавиша  
 5A Z клавиша  
VK_LWIN 5B Левая Windows клавиша (Microsoft® Natural® клавиатура)  
VK_RWIN 5C Правая Windows клавиша (Natural клавиатура)  
VK_APPS 5D Прикладная клавиша (Natural клавиатура)  
—  5E Зарезервировано  
VK_SLEEP 5F Спящего режима клавиша 
VK_NUMPAD0 60 Числовая клавиатура клавиша 0  
VK_NUMPAD1 61 Числовая клавиатура клавиша 1  
VK_NUMPAD2 62 Числовая клавиатура клавиша 2  
VK_NUMPAD3 63 Числовая клавиатура клавиша 3  
VK_NUMPAD4 64 Числовая клавиатура клавиша 4  
VK_NUMPAD5 65 Числовая клавиатура клавиша 5  
VK_NUMPAD6 66 Числовая клавиатура клавиша 6  
VK_NUMPAD7 67 Числовая клавиатура клавиша 7  
VK_NUMPAD8 68 Числовая клавиатура клавиша 8  
VK_NUMPAD9 69 Числовая клавиатура клавиша 9  
VK_MULTIPLY 6A Умножить клавиша  
VK_ADD 6B Добавить клавиша  
VK_SEPARATOR 6C Разделитель клавиша  
VK_SUBTRACT 6D Вычитания клавиша  
VK_DECIMAL 6E Десятичная клавиша  
VK_DIVIDE 6F Деления клавиша  
VK_F1 70 F1 клавиша  
VK_F2 71 F2 клавиша  
VK_F3 72 F3 клавиша  
VK_F4 73 F4 клавиша  
VK_F5 74 F5 клавиша  
VK_F6 75 F6 клавиша  
VK_F7 76 F7 клавиша  
VK_F8 77 F8 клавиша  
VK_F9 78 F9 клавиша  
VK_F10 79 F10 клавиша  
VK_F11 7A F11 клавиша  
VK_F12 7B F12 клавиша  
VK_F13 7C F13 клавиша  
VK_F14 7D F14 клавиша  
VK_F15 7E F15 клавиша  
VK_F16 7F F16 клавиша  
VK_F17 80H F17 клавиша  
VK_F18 81H F18 клавиша  
VK_F19 82H F19 клавиша  
VK_F20 83H F20 клавиша  
VK_F21 84H F21 клавиша  
VK_F22 85H F22 клавиша  
VK_F23 86H F23 клавиша  
VK_F24 87H F24 клавиша  
—  88–8F Неназначена  
VK_NUMLOCK 90 NUM LOCK клавиша  
VK_SCROLL 91 SCROLL LOCK клавиша  
 92–96 OEM specific 
—  97–9F неназначена  
VK_LSHIFT A0 Левый SHIFT клавиша 
VK_RSHIFT A1 Правый SHIFT клавиша 
VK_LCONTROL A2 Левый CONTROL клавиша 
VK_RCONTROL A3 Правый CONTROL клавиша 
VK_LMENU A4 Левый MENU клавиша 
VK_RMENU A5 Правый MENU клавиша 
VK_BROWSER_BACK A6 Windows 2000: Browser клавиша назад 
VK_BROWSER_FORWARD A7 Windows 2000: Browser клавиша вперед 
VK_BROWSER_REFRESH A8 Windows 2000: Browser клавиша обновить 
VK_BROWSER_STOP A9 Windows 2000: Browser клавиша стоп 
VK_BROWSER_SEARCH AA Windows 2000: Browser клавиша поиск 
VK_BROWSER_FAVORITES AB Windows 2000: Browser клавиша избранное 
VK_BROWSER_HOME AC Windows 2000: Browser клавиша старт и домой 
VK_VOLUME_MUTE AD Windows 2000: Звук выключить клавиша 
VK_VOLUME_DOWN AE Windows 2000: Звук уменьшить клавиша 
VK_VOLUME_UP AF Windows 2000: Звук увеличиьть клавиша 
VK_MEDIA_NEXT_TRACK B0 Windows 2000: Следующий трек клавиша 
VK_MEDIA_PREV_TRACK B1 Windows 2000: Предыдущий трек клавиша 
VK_MEDIA_STOP B2 Windows 2000: Media клавиша остановить 
VK_MEDIA_PLAY_PAUSE B3 Windows 2000: Media клавиша воспроизвести/пауза  
VK_LAUNCH_MAIL B4 Windows 2000: Почта запуск клавиша 
VK_LAUNCH_MEDIA_SELECT B5 Windows 2000: Media выбрать клавиша 
VK_LAUNCH_APP1 B6 Windows 2000: Запустить приложение 1 клавиша 
VK_LAUNCH_APP2 B7 Windows 2000: Запустить приложение 2 клавиша 
—  B8-B9 Зарезервировано 
VK_OEM_1 BA Windows 2000: Для стандартной клавиатуры US ';:' клавиша 
VK_OEM_PLUS BB Windows 2000: Для любого региона/страны '+' клавиша 
VK_OEM_COMMA BC Windows 2000: Для любого региона/страны ',' клавиша 
VK_OEM_MINUS BD Windows 2000: Для любого региона/страны '-' клавиша 
VK_OEM_PERIOD BE Windows 2000: Для любого региона/страны '.' клавиша 
VK_OEM_2 BF Windows 2000: Для стандартной клавиатуры US '/?' клавиша 
VK_OEM_3 C0 Windows 2000: Для стандартной клавиатуры US '`~' клавиша 
—  C1–D7 Зарезервировано  
—  D8–DA неназначена 
VK_OEM_4 DB Windows 2000: Для стандартной клавиатуры US '[{' клавиша 
VK_OEM_5 DC Windows 2000: Для стандартной клавиатуры US '\|' клавиша 
VK_OEM_6 DD Windows 2000: Для стандартной клавиатуры US ']}' клавиша 
VK_OEM_7 DE Windows 2000: Для стандартной клавиатуры US 'одинарные кавычки/двойные кавычки' клавиша 
VK_OEM_8 DF  
—  E0 Зарезервировано 
 E1 OEM зависимость 
VK_OEM_102 E2 Windows 2000: Или наклонная скобка или черта влево клавиша на RT 102-клавишной клавиатуре 
 E3–E4 OEM зависимость 
VK_PROCESSKEY E5 Windows 95/98, Windows NT 4.0, Windows 2000: IME PROCESS клавиша 
 E6 OEM зависимость 
VK_PACKET E7 Windows 2000: Используется для передачи символов Unicode как будто бли нажаты клавиши.Клавиша VK_PACKET является нижним словом 32-разрядной клавиши, используется для метода не клавиатурного ввода. Для большей информации смотри ремарку в KEYBDINPUT, SendInput, WM_KEYDOWN, и WM_KEYUP 
—  E8 неназначена  
 E9–F5 OEM зависимость 
VK_ATTN F6 Attn клавиша 
VK_CRSEL F7 CrSel клавиша 
VK_EXSEL F8 ExSel клавиша 
VK_EREOF F9 Erase EOF клавиша 
VK_PLAY FA Play клавиша 
VK_ZOOM FB Zoom клавиша 
VK_NONAME FC Зарезервировано для будущего использования  
VK_PA1 FD PA1 клавиша 
VK_OEM_CLEAR FE Clear клавиша

0

11

Теперь полностью разобрался

0

12

Коды кнопок можно узнать с помощью этой программы

Код:
OpenWindow(0,0,0,230,150,"", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
CreateGadgetList(WindowID(0))
EditorGadget(0,10,10,210,130 )
Repeat
  Event=WaitWindowEvent()
  If Event=#WM_KEYDOWN ; Была нажата кнопка
    AddGadgetItem(0,-1,Str( EventwParam())+"  " ) ; Помещаем её код в редактор
    SendMessage_(GadgetID(0),#EM_SETSEL,100000000,100000000) ; Прокрутка текста
  EndIf
Until Event=#PB_Event_CloseWindow

0

13

Очень познавательно получилось  о регистрации хуков на кнопки  - HotKeyAdd.
Скопировал себе и пример перехвата кнопок и таблицу соответствий и программу получения кода кнопок...

Наверно надо опубликовать отдельной статьёй...

Спасибо !

0

14

Почему не работает этот код и можно ли вообще не создавать окно? Ведь в создании таймера есть свойство, где нужно указать идентификатор окна. То есть без окна нельзя?:

Код:
;PB 4.31
Procedure Exit()
KillTimer_(WindowID(1), 2)
End
EndProcedure

Procedure Timer1()
 x.l=Random(1024)
 y=l=Random(768)
 SetMouseXY(x,y)
 
EndProcedure

OpenWindow(1, 296, 218, 507, 135, "Timer",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )

HotKeysInit() ; Инициализация библиотеки HotKeys
HotKeyAdd(WindowID(1), 27, @Exit(), "SkrinAll", 0,0,0) ;esc



SetTimer_(WindowID(1), 2, 50, @Timer1() )

Repeat
event=WaitWindowEvent()
Until event=#PB_Event_CloseWindow

PS: не пойму что такое 2 у таймера

Отредактировано daiomik (27.07.2010 18:29:23)

0

15

daiomik написал(а):

Почему не работает этот код

Работает, если в место WaitWindowEvent(), использовать HotkeyWaitWindowEvent().

daiomik написал(а):

можно ли вообще не создавать окно

Окно нужно для работы таймеров и хука кнопок.
Его можно сделать невидимым с помощью флага #PB_Window_Invisible

daiomik написал(а):

не пойму что такое 2 у таймера

Это идентификатор таймера.
Ведь можно создать много таймеров и если не использовать идентификаторы, то как узнать какой таймер сработал, и как указать функции KillTimer какой таймер нужно "прибить"?

0

16

В данном случае, можно не использовать перехват клавиш, а просто регулярно проверять нажата ли кнопка esc

Код:
;PB 4.31

Procedure Timer1()
 x.l=Random(1024)
 y=l=Random(768)
 SetMouseXY(x,y)
 
 If GetKeyState_(#VK_ESCAPE)<0
   End
 EndIf
EndProcedure

OpenWindow(1, 296, 218, 507, 135, "Timer",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )

SetTimer_(WindowID(1), 2, 50, @Timer1() )

Repeat
event=WaitWindowEvent()
Until event=#PB_Event_CloseWindow

0

17

У меня не закрывается прога...Второй вопрос: можно ли как нибудь изменять хаотично координаты не создавая окна..

0

18

daiomik написал(а):

Второй вопрос: можно ли как нибудь изменять хаотично координаты не создавая окна

Да можно.
Прога проработает 5 секунд и завершит работу

Код:
i=0
Repeat
 x.l=Random(1024)
 y=l=Random(768)
 SetMouseXY(x,y)
 Delay(50)
 i+1
 If i>100
   Break
 EndIf
ForEver

0

19

!!! Не дочитал и запустил - еле выключил !!!

0

Похожие темы


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Перехват нажатий кнопок и снятие скриншотов