📄 winmain.cpp
字号:
// WinMain.cpp file.
#include "stdafx.h"
#include "InputDevice.h"
#include "Log.h"
#include "resource.h"
#pragma comment(lib,"dinput.lib")
extern Log g_Log;
LPDIRECTINPUT8 g_pdi;
LPDIRECTINPUTDEVICE8 g_pdiKeyboard;
LPDIRECTINPUTDEVICE8 g_pdiMouse;
LPDIRECTINPUTDEVICE8 g_pdiJoystick;
TCHAR g_KeyState[256];
DIMOUSESTATE2 g_MouseState;
/////////////////////////////////////////////////////////////////
// 函数:Dlg_OnUpdateDate()
// 描述:
/////////////////////////////////////////////////////////////////
BOOL Dlg_OnUpdateData(HWND hDlg)
{
TCHAR strNewText[256*5 + 1] = _T("");
BOOL bKeyboard = ( IsDlgButtonChecked( hDlg, IDC_KEYBOARD ) == BST_CHECKED );
if (bKeyboard && g_pdiKeyboard)
{
#define KEYDOWN(name, key) (name[key] & 0x80)
#define DATA(x) #x
if(FAILED(DI_ReadInputDevice(g_pdiKeyboard,(void*)g_KeyState,256)))
{
_tcscpy(strNewText,_T("Unacquire"));
}
else
{
if (KEYDOWN(g_KeyState, DIK_ESCAPE))
{
_tcscpy(strNewText,DATA(DIK_ESCAPE));
}
}
}
else if (g_pdiMouse)
{
if (FAILED(DI_ReadInputDevice(g_pdiMouse,(void*)&g_MouseState,sizeof(DIMOUSESTATE2))))
{
_tcscpy(strNewText,_T("Unacquire"));
}
else
{
// display mouse coordinates (x, y, z) and buttons.
_stprintf( strNewText, _T("(X=% 3.3d, Y=% 3.3d, Z=% 3.3d) B0=%c B1=%c B2=%c B3=%c B4=%c B5=%c B6=%c B7=%c"),
g_MouseState.lX, g_MouseState.lY, g_MouseState.lZ,
(g_MouseState.rgbButtons[0] & 0x80) ? '1' : '0',
(g_MouseState.rgbButtons[1] & 0x80) ? '1' : '0',
(g_MouseState.rgbButtons[2] & 0x80) ? '1' : '0',
(g_MouseState.rgbButtons[3] & 0x80) ? '1' : '0',
(g_MouseState.rgbButtons[4] & 0x80) ? '1' : '0',
(g_MouseState.rgbButtons[5] & 0x80) ? '1' : '0',
(g_MouseState.rgbButtons[6] & 0x80) ? '1' : '0',
(g_MouseState.rgbButtons[7] & 0x80) ? '1' : '0');
}
}
if (g_pdiKeyboard || g_pdiMouse)
{
// 如果没有改变,则不用重设.
TCHAR strOldText[128];
GetDlgItemText( hDlg, IDC_DATA, strOldText, 127 );
if( 0 != lstrcmp( strOldText, strNewText ) )
SetDlgItemText( hDlg, IDC_DATA, strNewText );
}
return TRUE;
}
/////////////////////////////////////////////////////////////////
// 函数:Dlg_OnUpdateUI()
// 描述:
/////////////////////////////////////////////////////////////////
BOOL Dlg_OnUpdateUI(HWND hDlg)
{
BOOL bKeyboard;
BOOL bExclusive;
BOOL bForeground;
BOOL bDisableWindowsKey;
// Detrimine where the buffer would like to be allocated
bExclusive = ( IsDlgButtonChecked( hDlg, IDC_DISCL_EXCLUSIVE ) == BST_CHECKED );
bForeground = ( IsDlgButtonChecked( hDlg, IDC_DISCL_FOREGROUND ) == BST_CHECKED );
bDisableWindowsKey = ( IsDlgButtonChecked( hDlg, IDC_DISABLE_WINKEY ) == BST_CHECKED );
bKeyboard = ( IsDlgButtonChecked( hDlg, IDC_KEYBOARD ) == BST_CHECKED );
if( g_pdiKeyboard || g_pdiMouse)
{
SetDlgItemText( hDlg, IDC_CONTROL_DEVICE, TEXT("Release Device") );
SetDlgItemText( hDlg, IDC_DATA, TEXT("") );
SetFocus( GetDlgItem( hDlg, IDC_CONTROL_DEVICE ) );
EnableWindow( GetDlgItem( hDlg, IDC_DISCL_EXCLUSIVE ), FALSE );
EnableWindow( GetDlgItem( hDlg, IDC_DISCL_NONEXCLUSIVE ), FALSE );
EnableWindow( GetDlgItem( hDlg, IDC_DISCL_FOREGROUND ), FALSE );
EnableWindow( GetDlgItem( hDlg, IDC_DISCL_BACKGROUND ), FALSE );
EnableWindow( GetDlgItem( hDlg, IDC_DISABLE_WINKEY ), FALSE );
EnableWindow( GetDlgItem( hDlg, IDC_MOUSE ), FALSE );
EnableWindow( GetDlgItem( hDlg, IDC_KEYBOARD ), FALSE );
}
else
{
SetDlgItemText( hDlg, IDC_CONTROL_DEVICE, TEXT("Create Device") );
SetDlgItemText( hDlg, IDC_DATA,
TEXT("Device not created. Choose settings and click 'Create Device' then type to see results") );
EnableWindow( GetDlgItem( hDlg, IDC_DISCL_EXCLUSIVE ), TRUE );
EnableWindow( GetDlgItem( hDlg, IDC_DISCL_NONEXCLUSIVE ), TRUE );
EnableWindow( GetDlgItem( hDlg, IDC_DISCL_FOREGROUND ), TRUE );
EnableWindow( GetDlgItem( hDlg, IDC_DISCL_BACKGROUND ), TRUE );
EnableWindow( GetDlgItem( hDlg, IDC_MOUSE ), TRUE );
EnableWindow( GetDlgItem( hDlg, IDC_KEYBOARD ), TRUE );
if( !bExclusive && bForeground && bKeyboard )
EnableWindow( GetDlgItem( hDlg, IDC_DISABLE_WINKEY ), TRUE );
else
EnableWindow( GetDlgItem( hDlg, IDC_DISABLE_WINKEY ), FALSE );
}
if (bExclusive && !bForeground)
{
SetDlgItemText(hDlg,IDC_INFO,_T("Data Style:Immediate\nNo this behavior"));
}
else
{
SetDlgItemText(hDlg,IDC_INFO,_T("Data Style:Immediate\n"));
}
return TRUE;
}
/////////////////////////////////////////////////////////////////
// 函数:Dlg_OnInitDialog()
// 描述:
/////////////////////////////////////////////////////////////////
BOOL Dlg_OnInitDialog(HWND hwnd,HWND hwndFoucs,LPARAM lParam)
{
SetWindowText(hwnd,_T("输入设备"));
#ifdef _WIN64
HINSTANCE hInst = (HINSTANCE) GetWindowLongPtr( hwnd, GWLP_HINSTANCE );
#else
HINSTANCE hInst = (HINSTANCE) GetWindowLong( hwnd, GWL_HINSTANCE );
#endif
DI_InitDirectInput(hInst,hwnd);
ComboBox_SetCurSel(GetDlgItem(hwnd,IDC_DEVICE_NAME),0);
// Check the 'exclusive', 'foreground', and 'immediate' buttons by default.
CheckRadioButton( hwnd, IDC_DISCL_EXCLUSIVE, IDC_DISCL_NONEXCLUSIVE, IDC_DISCL_EXCLUSIVE );
CheckRadioButton( hwnd, IDC_DISCL_FOREGROUND, IDC_DISCL_BACKGROUND, IDC_DISCL_FOREGROUND );
CheckRadioButton( hwnd, IDC_MOUSE, IDC_KEYBOARD, IDC_MOUSE);
Dlg_OnUpdateUI(hwnd);
return 0;
}
/////////////////////////////////////////////////////////////////
// 函数:Dlg_OnControlDevice()
// 描述:
/////////////////////////////////////////////////////////////////
BOOL Dlg_OnControlDevice(HWND hDlg)
{
BOOL bExclusive;
BOOL bKeyboard;
BOOL bForeground;
BOOL bDisableWindowsKey;
DWORD dwCoopFlags;
// Detrimine where the buffer would like to be allocated
bExclusive = ( IsDlgButtonChecked( hDlg, IDC_DISCL_EXCLUSIVE ) == BST_CHECKED );
bForeground = ( IsDlgButtonChecked( hDlg, IDC_DISCL_FOREGROUND ) == BST_CHECKED );
bDisableWindowsKey = ( IsDlgButtonChecked( hDlg, IDC_DISABLE_WINKEY ) == BST_CHECKED );
bKeyboard = ( IsDlgButtonChecked( hDlg, IDC_KEYBOARD ) == BST_CHECKED );
if( bExclusive )
dwCoopFlags = DISCL_EXCLUSIVE; // 独占
else
dwCoopFlags = DISCL_NONEXCLUSIVE; // 非独占
if( bForeground )
dwCoopFlags |= DISCL_FOREGROUND;// 前台
else
dwCoopFlags |= DISCL_BACKGROUND;// 后台
// Disabling the windows key is only allowed only if we are in foreground nonexclusive
if( bDisableWindowsKey && !bExclusive && bForeground && bKeyboard )
dwCoopFlags |= DISCL_NOWINKEY;
if ( g_pdiMouse || g_pdiKeyboard)
{
if ( bKeyboard)
{
g_pdiKeyboard->Unacquire();
g_pdiKeyboard->Release();
g_pdiKeyboard = NULL;
}
else
{
g_pdiMouse->Unacquire();
g_pdiMouse->Release();
g_pdiMouse = NULL;
}
}
else
{
if ( bKeyboard )
{
if (FAILED(g_pdiKeyboard = DI_KeyboardInputDevice(hDlg,dwCoopFlags)))
{
return FALSE;
}
}
else
{
if (FAILED(g_pdiMouse = DI_MouseInputDevice(hDlg,dwCoopFlags)))
{
return FALSE;
}
}
}
Dlg_OnUpdateUI(hDlg);
return TRUE;
}
/////////////////////////////////////////////////////////////////
// 函数:Dlg_OnCommand()
// 描述:
/////////////////////////////////////////////////////////////////
BOOL Dlg_OnCommand(HWND hwnd,int id,HWND hWndCtl,int codeNotify)
{
switch(id)
{
case IDCANCEL:
PostQuitMessage(0);break;
case IDC_DEVICE_NAME:break;
case IDC_DISCL_EXCLUSIVE:
case IDC_DISCL_NONEXCLUSIVE:
case IDC_DISCL_FOREGROUND:
case IDC_DISCL_BACKGROUND:
case IDC_DISABLE_WINKEY:
case IDC_DS_IMMEDIATE:
case IDC_DS_BUFFERED:
case IDC_KEYBOARD:
case IDC_MOUSE:
Dlg_OnUpdateUI(hwnd);break;
case IDC_CONTROL_DEVICE:
if (codeNotify == BN_CLICKED)
Dlg_OnControlDevice(hwnd);break;
}
return 0;
}
/////////////////////////////////////////////////////////////////
// 函数:DlgProc()
// 描述:
/////////////////////////////////////////////////////////////////
BOOL WINAPI DlgProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
HANDLE_MSG(hwnd,WM_INITDIALOG,Dlg_OnInitDialog);
HANDLE_MSG(hwnd,WM_COMMAND,Dlg_OnCommand);
}
return 0;
}
int WINAPI _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
g_Log.Log_Start();
HWND hwnd(CreateDialog(hInstance,MAKEINTRESOURCE(IDD_INPUT_DEVICE),0,DlgProc));
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
MSG msg = {0};
while(msg.message != WM_QUIT)
{
if ( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Sleep(100);
Dlg_OnUpdateData(hwnd);
}
}
g_Log.Log_End();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -