Re[7]: Горячие клавишы
От: alexandrov_alex США  
Дата: 30.10.03 06:37
Оценка: 15 (2)
Здравствуйте, _sergius_, Вы писали:

s> _>Кто же мешает отдать NULL в качестве дескриптора и ловить сообщения с

s> hWnd равным NULL? Я не хочу сказать, что я так делал, но должно
s> работать. Другое дело, что вообще пытаться управлять сервисом
s> непосредственно с клавиатуры является в корне неверным подходом, но это
s> уже как-то обсуждалось, повторяться не буду.
s>
s> Вы меня тоже удивляете . Вы всегда верите тому что написано в MSDN?
s> Могу привести массу примеров, когда написанное не отвечает реальности.
s> Так вот, если не знаете, то лучше не говорите, а попробуйте на практике.
s> Говорить все умеют.

Ты груб и не в тему. Уж поверь, я умею не только говорить. MSDN я склонен скорее верить, чем нет. Потому что в основном там написана правда. А те, кто ехидно радуется, найдя ошибку в документации от Microsoft, видимо, сами никогда ничего не писали.

P.S. Специально для тебя:
#include "stdafx.h"
#include <windows.h>
#include <atlbase.h>


#define JOB_HOTKEY_ID 0
#define QUIT_HOTKEY_ID 1

int main(int argc, char* argv[])
{
 BOOLEAN br;
 MSG theMsg;

 br = RegisterHotKey(NULL, JOB_HOTKEY_ID, MOD_WIN, 'S');
 ATLASSERT(br);

 br = RegisterHotKey(NULL, QUIT_HOTKEY_ID, MOD_WIN, 'Q');
 ATLASSERT(br);

 _tprintf(_T("Press Win+S to make the job, Win+Q to quit.\n")); 

 while(GetMessage(&theMsg, NULL, 0, 0)) {
  if (theMsg.message = WM_HOTKEY && theMsg.wParam == JOB_HOTKEY_ID) {
   printf("The job is done!!!\n");
  }

  if (theMsg.message = WM_HOTKEY && theMsg.wParam == QUIT_HOTKEY_ID) {
   printf("Quitting app...\n");
   PostQuitMessage(0);
  }
 
 }

 UnregisterHotKey(NULL, QUIT_HOTKEY_ID);
 UnregisterHotKey(NULL, JOB_HOTKEY_ID);

 return 0;
}


Код был протестирован на XP, 98. Все работает. И DirectInput тут на фиг не нужен...

-- Всего хорошего!
-- Alex Alexandrov, e-mail: alex_alexandrov@fromru.com
Posted via RSDN NNTP Server 1.8 beta
It's kind of fun to do the impossible (Walt Disney)
Re[8]: Горячие клавишы
От: Блудов Павел Россия  
Дата: 30.10.03 07:46
Оценка: 18 (4)
Здравствуйте, alexandrov_alex, Вы писали:

А бы еще порекомендовал заменить

_> while(GetMessage(&theMsg, NULL, 0, 0)) {


на

_> while(GetMessage(&theMsg, (HWND)INVALID_HANDLE_VALUE, WM_HOTKEY, WM_HOTKEY)) {


В этом случае цикл выборки сообщений будет вычитывать только сообщения WM_HOTKEY,
причем только те, у которых HWND == NULL.

Кстати, вот тут у MSDN лажа вышла. Для PeekMessage сказано, что будет в случае
(HWND)INVALID_HANDLE_VALUE, а для GetMessage про это написать забыли.
Хотя работает.

Павел.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.