2 вопроса:
1)как совершить действие по нажатию клавиши (в данном случае меня интересует как при нажатии принт скрин сделать снимок всего экрана)
2)вытекает из первого: как сделать снимок экрана
PS: примеры смотрел: в одном с использованием библиотек, в другом не понятно ничего было
Перехват нажатий кнопок и снятие скриншотов
Сообщений 1 страница 19 из 19
Поделиться126.07.2010 16:14:14
Поделиться226.07.2010 16:59:05
Этот пример смотрел http://pure-basic.narod.ru/project/skrinhot.html
Там как раз снимается скрин всего экрана, при нажатии PrintScreen и скрин активного окна, при нажатии Ctrl + PrintScreen.
Поделиться326.07.2010 17:09:23
Смотрел, вот как раз здесь и не понял. Например ни разу не видел этой записи:Event=HotkeyWaitWindowEvent() обычно же пишут Event=WaitWindowEvent() И что то я тут не увидел, где происходит отслеживание этого нажатия
Поделиться426.07.2010 19:17:16
Например ни разу не видел этой записи:Event=HotkeyWaitWindowEvent()
Это функция из библиотеки Hotkey (установка хука (перехвата) на кнопки клавиатуры).
И что то я тут не увидел, где происходит отслеживание этого нажатия
Там есть функции регистрации хуков на кнопки - 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
Поделиться526.07.2010 19:28:53
На много стало понятней...но не вижу тут PrintScreen и Ctrl + PrintScreen.. А если мне нужно событие на другую клавишу назначить?
Поделиться626.07.2010 19:37:51
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Поделиться726.07.2010 19:41:48
Спасибо!
Поделиться826.07.2010 20:08:50
Вот простейшая программа, снимающая скрины всего экрана (кнопка 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Поделиться926.07.2010 20:17:18
Все доходчиво и ясно. А как узнать номера этих клавиш? Как я пойму на какой номер соответствует W
Поделиться1026.07.2010 20:19:32
А как узнать номера этих клавиш? Как я пойму на какой номер соответствует 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 клавишаПоделиться1126.07.2010 20:22:51
Теперь полностью разобрался
Поделиться1226.07.2010 20:24:21
Коды кнопок можно узнать с помощью этой программы
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Поделиться1327.07.2010 00:06:56
Очень познавательно получилось о регистрации хуков на кнопки - HotKeyAdd.
Скопировал себе и пример перехвата кнопок и таблицу соответствий и программу получения кода кнопок...
Наверно надо опубликовать отдельной статьёй...
Спасибо !
Поделиться1427.07.2010 18:28:13
Почему не работает этот код и можно ли вообще не создавать окно? Ведь в создании таймера есть свойство, где нужно указать идентификатор окна. То есть без окна нельзя?:
;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)
Поделиться1527.07.2010 18:39:19
Почему не работает этот код
Работает, если в место WaitWindowEvent(), использовать HotkeyWaitWindowEvent().
можно ли вообще не создавать окно
Окно нужно для работы таймеров и хука кнопок.
Его можно сделать невидимым с помощью флага #PB_Window_Invisible
не пойму что такое 2 у таймера
Это идентификатор таймера.
Ведь можно создать много таймеров и если не использовать идентификаторы, то как узнать какой таймер сработал, и как указать функции KillTimer какой таймер нужно "прибить"?
Поделиться1627.07.2010 18:45:19
В данном случае, можно не использовать перехват клавиш, а просто регулярно проверять нажата ли кнопка 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
Поделиться1727.07.2010 19:10:47
У меня не закрывается прога...Второй вопрос: можно ли как нибудь изменять хаотично координаты не создавая окна..
Поделиться1827.07.2010 19:19:53
Второй вопрос: можно ли как нибудь изменять хаотично координаты не создавая окна
Да можно.
Прога проработает 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
Поделиться1927.07.2010 22:45:17
!!! Не дочитал и запустил - еле выключил !!!
Похожие темы
| Таймер | PureBasic для Windows | 16.07.2011 |