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 |