除非窗口具有焦点,否则无法获取键盘(C ++,DirectX9)

时间:2014-04-25 15:43:00

标签: c++ directx-9

使用DirectX 9,如果我的程序试图获取它时另一个程序有焦点,我将无法获取键盘设备。如果用户在我的程序初始化时单击另一个窗口,则会出现此问题。

我调用Windows的SetFocus和SetCapture函数,但它似乎没有效果。

  

#define FAILED(hr)(((HRESULT)(hr))< 0)//在WinError.h中

     

...

     

class CantCreate {}; //我的异常类

     

Keyboard :: Keyboard(LPDIRECTINPUT8 pDI,HWND hwnd)

     

{

     
    

LPDIRECTINPUTDEVICE8 m_pDIDev;

         

if(FAILED(pDI-> CreateDevice(GUID_SysKeyboard,& m_pDIDev,NULL)))

         
      

抛出CantCreate();

    
         

if(FAILED(m_pDIDev-> SetDataFormat(& c_dfDIKeyboard)))

         
      

抛出CantCreate();

    
         

if(FAILED(m_pDIDev-> SetCooperativeLevel(hwnd,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE)))

         
      

抛出CantCreate();

    
         

SetFocus(hwnd); SetCapture(hwnd);

         

if(FAILED(m_pDIDev-> Acquire()))抛出CantCreate(); //< - 在此处抛出异常
    }

  

我也尝试用

替换最后一行
  

while(FAILED(m_pDIDev-> Acquire())){SetFocus(hwnd); SetCapture(hwnd); }

......但它永远不会抓住焦点。

获得焦点或获取键盘而不需要对焦的最佳方法是什么?

根据以下答案的讨论,我试了这个,以便它可以等待焦点:

while (true)
{
    while (GetFocus () != hwnd) Sleep (100);
    if (! FAILED(m_pDIDev->Acquire())) break;
} 

有时候它很漂亮。有时应用程序冻结。

1 个答案:

答案 0 :(得分:2)

这是一个安全功能,而不是弱点。

如果程序可以抓住键盘,那么想想退出你不想运行的恶意软件是多么痛苦。

尝试之间睡一会儿。一旦焦点更改为您的应用程序,您就可以执行所需的操作。