Горячие клавиши если окно не в фокусе

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 7 окт 2009.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Допустим есть окно с прорисовкой SW_HIDE,как ловить комбинации горячих клавишь когда в фокусе находится какое то другое окно? Ведь в таком случае WM сообщения неприходят нужному окну.
     
  2. _Sl4yer

    _Sl4yer New Member

    Публикаций:
    0
    Регистрация:
    2 мар 2009
    Сообщения:
    55
    глобальный хук?
     
  3. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Хотелось бы нетревожить проактивку антивирусов безвредной программой.
     
  4. VaZoNeZ

    VaZoNeZ New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    121
    GetAsyncKeyState ?
     
  5. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    RegisterHotKey? :-D
     
  6. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Читай віше,я уже писал что сообщение не приходит если в этот момент другое окно в фокусе.
     
  7. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    не знаю я, работает всё у людей:
    и будь добр: пишешь по-узбекски - прикрепляй к сообщениям сало ,)
     
  8. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    RegisterHotKey у меня тоже нормально работает, в случае если кто-то уже не зарегистрировал эту комбинацию клавиш.

    offtop:
    Comer_
    не, по узбекски пишется либо латиницей, либо кириллицей (хотя и в том и в другом наборе присутствуют модифицированные символы (типа символ ~ с верху буквы)), и не сало, а бараний курдюк, скорее смахивает на украинский :)
     
  9. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Проект из студии,вписал туда RegisterHotKey.Если в фокусе другое окно то собщение WM_HOTKEY этому окну неприходит
    Код (Text):
    1. #define MAX_LOADSTRING 100
    2.  
    3. // Глобальные переменные:
    4. HINSTANCE hInst;                                // текущий экземпляр
    5. TCHAR szTitle[MAX_LOADSTRING];                  // Текст строки заголовка
    6. TCHAR szWindowClass[MAX_LOADSTRING];            // имя класса главного окна
    7.  
    8. // Отправить объявления функций, включенных в этот модуль кода:
    9. ATOM                MyRegisterClass(HINSTANCE hInstance);
    10. BOOL                InitInstance(HINSTANCE, int);
    11. LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
    12. INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
    13.  
    14. int APIENTRY _tWinMain(HINSTANCE hInstance,
    15.                      HINSTANCE hPrevInstance,
    16.                      LPTSTR    lpCmdLine,
    17.                      int       nCmdShow)
    18. {
    19.     UNREFERENCED_PARAMETER(hPrevInstance);
    20.     UNREFERENCED_PARAMETER(lpCmdLine);
    21.  
    22.     // TODO: разместите код здесь.
    23.     MSG msg;
    24.     HACCEL hAccelTable;
    25.  
    26.     // Инициализация глобальных строк
    27.     LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    28.     LoadString(hInstance, IDC_KEYS1, szWindowClass, MAX_LOADSTRING);
    29.     MyRegisterClass(hInstance);
    30.  
    31.     // Выполнить инициализацию приложения:
    32.     if (!InitInstance (hInstance, nCmdShow))
    33.     {
    34.         return FALSE;
    35.     }
    36.  
    37.     hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_KEYS1));
    38.  
    39.     // Цикл основного сообщения:
    40.     while (GetMessage(&msg, NULL, 0, 0))
    41.     {
    42.         if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    43.         {
    44.             TranslateMessage(&msg);
    45.             DispatchMessage(&msg);
    46.         }
    47.     }
    48.  
    49.     return (int) msg.wParam;
    50. }
    51.  
    52.  
    53.  
    54. //
    55. //  ФУНКЦИЯ: MyRegisterClass()
    56. //
    57. //  НАЗНАЧЕНИЕ: регистрирует класс окна.
    58. //
    59. //  КОММЕНТАРИИ:
    60. //
    61. //    Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код
    62. //    был совместим с системами Win32, не имеющими функции RegisterClassEx'
    63. //    которая была добавлена в Windows 95. Вызов этой функции важен для того,
    64. //    чтобы приложение получило "качественные" мелкие значки и установило связь
    65. //    с ними.
    66. //
    67. ATOM MyRegisterClass(HINSTANCE hInstance)
    68. {
    69.     WNDCLASSEX wcex;
    70.  
    71.     wcex.cbSize = sizeof(WNDCLASSEX);
    72.  
    73.     wcex.style          = CS_HREDRAW | CS_VREDRAW;
    74.     wcex.lpfnWndProc    = WndProc;
    75.     wcex.cbClsExtra     = 0;
    76.     wcex.cbWndExtra     = 0;
    77.     wcex.hInstance      = hInstance;
    78.     wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_KEYS1));
    79.     wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    80.     wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    81.     wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_KEYS1);
    82.     wcex.lpszClassName  = szWindowClass;
    83.     wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    84.  
    85.     return RegisterClassEx(&wcex);
    86. }
    87.  
    88. //
    89. //   ФУНКЦИЯ: InitInstance(HINSTANCE, int)
    90. //
    91. //   НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
    92. //
    93. //   КОММЕНТАРИИ:
    94. //
    95. //        В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
    96. //        создается и выводится на экран главное окно программы.
    97. //
    98. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    99. {
    100.    HWND hWnd;
    101.  
    102.    hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной
    103.  
    104.    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
    105.       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    106.  
    107.    if (!hWnd)
    108.    {
    109.       return FALSE;
    110.    }
    111.    
    112.    ShowWindow(hWnd, /*nCmdShow*/SW_HIDE);
    113.    UpdateWindow(hWnd);
    114.     RegisterHotKey(hWnd,0,MOD_ALT,112);
    115.    return TRUE;
    116. }
    117.  
    118. //
    119. //  ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
    120. //
    121. //  НАЗНАЧЕНИЕ:  обрабатывает сообщения в главном окне.
    122. //
    123. //  WM_COMMAND  - обработка меню приложения
    124. //  WM_PAINT    -Закрасить главное окно
    125. //  WM_DESTROY   - ввести сообщение о выходе и вернуться.
    126. //
    127. //
    128. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    129. {
    130.     int wmId, wmEvent;
    131.     PAINTSTRUCT ps;
    132.     HDC hdc;
    133.     char buf[1024];
    134.     switch (message)
    135.     {
    136.     /*case WM_COMMAND:
    137.         wmId    = LOWORD(wParam);
    138.         wmEvent = HIWORD(wParam);
    139.         // Разобрать выбор в меню:
    140.         switch (wmId)
    141.         {
    142.         case IDM_ABOUT:
    143.             DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
    144.             break;
    145.         case IDM_EXIT:
    146.             DestroyWindow(hWnd);
    147.             break;
    148.         default:
    149.             return DefWindowProc(hWnd, message, wParam, lParam);
    150.         }
    151.         break;*/
    152.     case WM_HOTKEY:
    153.     wsprintf((LPWSTR)buf,L"%X;%X",wParam,lParam);
    154.     MessageBox(hWnd,(LPCWSTR)buf,L"!!!",MB_OK);
    155.         break;
    156.     case WM_PAINT:
    157.         hdc = BeginPaint(hWnd, &ps);
    158.         // TODO: добавьте любой код отрисовки...
    159.         EndPaint(hWnd, &ps);
    160.         break;
    161.     case WM_DESTROY:
    162.         PostQuitMessage(0);
    163.         break;
    164.     default:
    165.         return DefWindowProc(hWnd, message, wParam, lParam);
    166.     }
    167.     return 0;
    168. }
     
  10. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    а это по-вашему - что? русская, украинская письменность Э кириллица
    о, я просто забыл добавить [/ironic], сумимасэ.
     
  11. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    _nic, окно у тебя скрыто, hWnd у MessageBox прописан. Вот ты сообщений не видишь.
    Код (Text):
    1. MessageBox(NULL,(LPCWSTR)buf,L"!!!",MB_OK);
     
  12. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Ы пока нет другого окна в фокусе то вижу
     
  13. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Сорри немного затупил,таки проблема в указателе на родительское окно была.Но все таки интересно почему месаджбокс продолжает вызыватся хайдом род.окна, пока в фокус не попадет другое окно?