⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winmain.cpp

📁 VC++ DEMO, used for the beginners and the amour
💻 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 + -