使用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; }
有时候它很漂亮。有时应用程序冻结。
答案 0 :(得分:2)
这是一个安全功能,而不是弱点。
如果程序可以抓住键盘,那么想想退出你不想运行的恶意软件是多么痛苦。
尝试之间睡一会儿。一旦焦点更改为您的应用程序,您就可以执行所需的操作。