Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Горячие кнопки  (Прочитано 14937 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Serega
Гость
« : 07-08-2004 17:47 » 

В винде существуют горячие кнопки для различных действий, вроде открыть проводник(win+e) или закрыть текущее окно(ctrl+w)

Я хочу написать программку для связывания таких действий с произвольной комбинацией клавиш

Основной вопрос - как эти действия идентифицируются в винде, проще говоря какую функцию надо вызвать чтобы например закрыть текущее окно или в эксплорере перемещаться вперед/назад по страничкам
Записан
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 09-08-2004 10:52 » 

Serega, Есть мнение, что для этого нужно послать сообщение окну.
Например закрыть - WM_CLOSE. Как узнать, какие сообщения посылаются - используя программку слежения за окнами (По-моему так: WinSpy из поставки Borland aka Inspire; Spy++ из поставки Visual Studio)
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #2 : 09-08-2004 14:26 » 

SendMessage  Улыбаюсь
Записан

Удачного всем кодинга! -=x[PooH]x=-
.
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 18-08-2004 18:11 » 

Если писать свои сочетания клавиш, то не надо не передавать сообщения дальше. эт. раз, а лучше, если их исключить вообще.
Записан
x77
Команда клуба

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #4 : 19-08-2004 14:33 » 

Serega, так тебе придётся ставить глобальный хук.  потом смотреть, если нажатая клавиша относится к текущему окну - выполнять некое действие, если к конкретному (например, по Ctrl+Alt+R - всегда вытаскивать "Run...") - то соответственно. как правильно считают сотоварищи, самое простое - SendMessage, но это сработает только в том случае, если на указанный Message требуемое окно имеет нужную тебе процедуру обработки. в принципе, для большинства окон стандартные процедуры свёртывания, развертывания, закрытия, etc. будут работать, можно задать даже что-то специфическое, типа запрограммировать скрипт для последовательного нажатия определённых клавиш мыши в определённых положениях от верхнего левого угла нужного окна. но вот, к примеру, переключать кодировки в экспловере нажатием горячих клавиш через SendMessage не удастся. поэтому мне думается, что для некоторых прог, особенно мастдайных, имеет смысл предусмотреть свою отдельную отработку hotkey'ев через COM-овские интерфейсы или что-то ещё.

TJSoft, вот как раз таки в хуке ты и будешь задавать, передавать мессагу дальше по цепочке, или глушить на корню.
Записан

.
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 20-08-2004 11:25 » 

знаю, я сам переключаю раскладку клавиатуры по RWin и когда у меня русский, то загорается ScrollLED Ага
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 27-12-2006 18:59 » 

А вот вопрос такой. Как в пределах одного процесса сделать глобальную горклавишу? Чтобы , к примеру , где бы не находился фокус в моей программе - на главном ли окне, на диалогах/их контролах , я жму , скажем , пробел, и всегда гарантированно запустится некая процедура?
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 28-12-2006 06:58 » 

Цитата
RegisterHotKey Function
The RegisterHotKey function defines a system-wide hot key.

Syntax


BOOL RegisterHotKey(          HWND hWnd,
    int id,
    UINT fsModifiers,
    UINT vk
);
Parameters

hWnd
[in] Handle to the window that will receive WM_HOTKEY messages generated by the hot key. If this parameter is NULL, WM_HOTKEY messages are posted to the message queue of the calling thread and must be processed in the message loop.
id
[in] Specifies the identifier of the hot key. No other hot key in the calling thread should have the same identifier. An application must specify a value in the range 0x0000 through 0xBFFF. A shared DLL must specify a value in the range 0xC000 through 0xFFFF (the range returned by the GlobalAddAtom function). To avoid conflicts with hot-key identifiers defined by other shared DLLs, a DLL should use the GlobalAddAtom function to obtain the hot-key identifier.
fsModifiers
[in] Specifies keys that must be pressed in combination with the key specified by the uVirtKey parameter in order to generate the WM_HOTKEY message. The fsModifiers parameter can be a combination of the following values.
MOD_ALT
Either ALT key must be held down.
MOD_CONTROL
Either CTRL key must be held down.
MOD_SHIFT
Either SHIFT key must be held down.
MOD_WIN
Either WINDOWS key was held down. These keys are labeled with the Microsoft Windows logo.
vk
[in] Specifies the virtual-key code of the hot key.
Return Value

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.



Remarks

When a key is pressed, the system looks for a match against all hot keys. Upon finding a match, the system posts the WM_HOTKEY message to the message queue of the thread that registered the hot key. This message is posted to the beginning of the queue so it is removed by the next iteration of the message loop.

This function cannot associate a hot key with a window created by another thread.

RegisterHotKey fails if the keystrokes specified for the hot key have already been registered by another hot key.

If the window identified by the hWnd parameter already registered a hot key with the same identifier as that specified by the id parameter, the new values for the fsModifiers and vk parameters replace the previously specified values for these parameters.

Windows NT4 and Windows 2000/XP: The F12 key is reserved for use by the debugger at all times, so it should not be registered as a hot key. Even when you are not debugging an application, F12 is reserved in case a kernel-mode debugger or a just-in-time debugger is resident.

Function Information

Minimum DLL Version user32.dll
Header Declared in Winuser.h, include Windows.h
Import library User32.lib
Minimum operating systems Windows 95, Windows NT 3.1
Unicode Implemented as Unicode version.

Записан

ещё один вопрос ...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 28-12-2006 16:07 » 

nikedeforest, вау, пасиб, попробую )
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 28-12-2006 16:58 » 

аа, всё клёво...
Только как распространить это не на всю систему, а только но мой процесс?

Мысль только одна - посмотреть, какое окно щас в фокусе и определить, относится они к моему процессу или нет...

-------
и вообще говоря вот что не устраивает... К примеру зарегил я виртуальную клавишу VK_BACK
Теперь, когда программа запущена, то Улыбаюсь в том же блокноте не работает бэкспейс уже...
Как вернуть отправителю "управление" , когда моя процедура уже отработала своё?
« Последнее редактирование: 28-12-2006 17:11 от Алексей1153 » Записан

zubr
Гость
« Ответ #10 : 28-12-2006 17:26 » 

Алексей1153, в твоем случае проще поставить неглобальный хук, как раз будешь определять нажатия клавиш в пределах своего процесса. А вот автору темы может как раз и есть смысл воспользоваться RegisterHotKey.
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 28-12-2006 18:35 » 

Извини Леха, я не так тебя понял.
Записан

ещё один вопрос ...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 28-12-2006 20:23 » 

nikedeforest, всё норм, тоже вещь полезную я узнал от тебя )

zubr, как энтот неглобальный хук поставить?
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #13 : 28-12-2006 20:41 » 

Леха функция SetWindowsHookEx. Глобальный хук отличается от локального тем, что глобальный нужно делать в библиотеке ДЛЛ. Локальный в самом теле программы.
Вот тут  пример хука от Майкрософт.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 30-12-2006 04:55 » 

Finch, спасибо, то что надо ) Всё получилося
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines