2013-06-13 3 views
1

Я пишу код, который определяет нажатие клавиши, когда окно не в фокусе:SetTimer из нестатической функции

// MainHamsterDlg.cpp : implementation file 

#include "stdafx.h" 
#include "MainHamsterDlg.h" 

// MainHamsterDlg dialog 
IMPLEMENT_DYNAMIC(MainHamsterDlg, CDialogEx) 

MainHamsterDlg::MainHamsterDlg(CWnd* pParent) 
    : CDialogEx(MainHamsterDlg::IDD, pParent) 
    {} 

void MainHamsterDlg::DoDataExchange(CDataExchange* pDX) 
{ 
    CDialogEx::DoDataExchange(pDX); 
} 


BEGIN_MESSAGE_MAP(MainHamsterDlg, CDialogEx) 
    ON_WM_TIMER() 
END_MESSAGE_MAP() 

HHOOK _hook; 
KBDLLHOOKSTRUCT kbdStruct; 

LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode >= 0) 
    { 
     if (wParam == WM_KEYUP) 
     { 
      kbdStruct = *((KBDLLHOOKSTRUCT*)lParam); 
      if (kbdStruct.vkCode == VK_INSERT) 
      { 
       //I want start timer there 
      } 
     } 
    } 
return CallNextHookEx(_hook, nCode, wParam, lParam); 
} 

void SetHook() 
{ 
    if (!(_hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0))) 
    { 
     MessageBox(NULL, "Failed to install hook!", "Error", MB_ICONERROR); 
    } 
} 

void ReleaseHook() 
{ 
    UnhookWindowsHookEx(_hook); 
} 

BOOL MainHamsterDlg::OnInitDialog() 
{ 
    SetHook(); 
    //SetTimer(0, 0, NULL); <<<------- this starts timer 
    CDialogEx::OnInitDialog(); 
    return TRUE; 
} 

void MainHamsterDlg::OnTimer(UINT nIDEvent) 
{ 
    //do something 
CDialog::OnTimer(nIDEvent); 
} 

Я хочу начать таймер на нажатие клавиши, когда окно не сфокусирован. Нужно ли использовать некоторые указатели или что вызвать SetTimer из этой функции. Если есть проблема, чтобы заставить таймер работать с нажатием клавиши, когда приложение не фокусируется, я хочу знать.

ответ

-1

Лучший ответ, что я получаю на this веб-страницы прописан Энди

+0

Ссылка только ответы категорически не рекомендуется на StackOverflow, потому что веб-страница или веб-сайт могут исчезнуть в будущем. –

1

В документации SetTimer (MSDN) указано, что вам необходимо передать HWND, чтобы вы получили уведомление OnTimer. Таким образом, вам нужно каким-то образом получить CDial-> m_hWnd для глобальной функции set SetTimer win32.

Другим вариантом является вызов функции-члена MainHamsterDlg из функции hook окна при нажатии клавиши, и диалог может вызвать его на SetTimer (CWnd :: SetTimer). Тем не менее HookCallback должен каким-то образом узнать о диалоговом объекте.

Я не знаю другого метода, чтобы получить сообщение с клавиатурой в нефокусированное окно.

+0

Я думаю, что первый один я лучше. любые идеи, как получить дескриптор окна в этой функции? – Klasik

+1

К сожалению, глобальная переменная - единственная возможность, о которой я могу думать. Вот почему мне не нравится вариант 1. В варианте 1 вы просто используете глобальную переменную для маршрутизации своего вызова в более значимый контекст и реализуете всю логику в диалоговом окне. – PermanentGuest

+0

ou. хорошо, тогда. У меня больше опыта, чем у меня. это будет здорово, если вы можете написать код на опции 2? ты можешь? Я изучаю код, что я вижу) – Klasik