2025-11-28 00:35:46 +09:00

229 lines
6.8 KiB
C++

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved
#include "stdafx.h"
/******************************************************************
* *
* Global Variables *
* *
******************************************************************/
HWND g_hwnd = NULL;
INPUT_MESSAGE_SOURCE g_inputSource;
/******************************************************************
* *
* Function Prototypes *
* *
******************************************************************/
HRESULT Initialize(HINSTANCE hInstance);
HRESULT OnRender(HDC hdc, const RECT &rcPaint);
void OnResize(UINT width, UINT height);
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
/******************************************************************
* *
* WinMain *
* *
* Application entrypoint *
* *
******************************************************************/
_Use_decl_annotations_
int
WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
UNREFERENCED_PARAMETER(nCmdShow);
HRESULT hr = E_FAIL;
ZeroMemory(&g_inputSource, sizeof(g_inputSource));
if (SUCCEEDED(hr = Initialize(hInstance)))
{
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return SUCCEEDED(hr);
}
/******************************************************************
* *
* InputSourceApp::Initialize *
* *
* This method is used to create and display the application *
* window, and provides a convenient place to create any device *
* independent resources that will be required. *
* *
******************************************************************/
HRESULT Initialize(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
ATOM atom;
// Register window class
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = sizeof(LONG_PTR);
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = NULL;
wcex.lpszMenuName = NULL;
wcex.lpszClassName = TEXT("InputSourceApp");
wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
atom = RegisterClassEx(&wcex);
SetProcessDPIAware();
// Create window
g_hwnd = CreateWindow(
TEXT("InputSourceApp"),
TEXT("Input Source Identification Sample"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
640,
480,
NULL,
NULL,
hInstance,
NULL
);
if (g_hwnd)
{
ShowWindow(
g_hwnd,
SW_SHOWNORMAL
);
UpdateWindow(
g_hwnd
);
}
return g_hwnd ? S_OK : E_FAIL;
}
HRESULT OnRender(HDC hdc, const RECT &rcPaint)
{
WCHAR wzText[512];
FillRect(hdc, &rcPaint, (HBRUSH)GetStockObject(WHITE_BRUSH));
StringCchCopyW(wzText, ARRAYSIZE(wzText), L"Source: ");
switch(g_inputSource.deviceType)
{
case IMDT_UNAVAILABLE:
StringCchCatW(wzText, ARRAYSIZE(wzText), L"Unavailable\n");
break;
case IMDT_KEYBOARD:
StringCchCatW(wzText, ARRAYSIZE(wzText), L"Keyboard\n");
break;
case IMDT_MOUSE:
StringCchCatW(wzText, ARRAYSIZE(wzText), L"Mouse\n");
break;
case IMDT_TOUCH:
StringCchCatW(wzText, ARRAYSIZE(wzText), L"Touch\n");
break;
case IMDT_PEN:
StringCchCatW(wzText, ARRAYSIZE(wzText), L"Pen\n");
break;
}
StringCchCatW(wzText, ARRAYSIZE(wzText), L"Origin: ");
switch(g_inputSource.originId)
{
case IMO_UNAVAILABLE:
StringCchCatW(wzText, ARRAYSIZE(wzText), L"Unavailable\n");
break;
case IMO_HARDWARE:
StringCchCatW(wzText, ARRAYSIZE(wzText), L"Hardware\n");
break;
case IMO_INJECTED:
StringCchCatW(wzText, ARRAYSIZE(wzText), L"Injected\n");
break;
case IMO_SYSTEM:
StringCchCatW(wzText, ARRAYSIZE(wzText), L"System\n");
break;
}
DrawText(hdc, wzText, (int)wcslen(wzText), (LPRECT)&rcPaint, DT_TOP | DT_LEFT);
return S_OK;
}
/******************************************************************
* *
* WndProc *
* *
* This static method handles our app's window messages *
* *
******************************************************************/
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if ((message >= WM_MOUSEFIRST && message <= WM_MOUSELAST) ||
(message >= WM_KEYFIRST && message <= WM_KEYLAST) ||
(message >= WM_TOUCH && message <= WM_POINTERWHEEL))
{
GetCurrentInputMessageSource(&g_inputSource);
InvalidateRect(g_hwnd, NULL, FALSE);
}
switch (message)
{
case WM_PAINT:
case WM_DISPLAYCHANGE:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
OnRender(hdc, ps.rcPaint);
EndPaint(hwnd, &ps);
}
return 0;
case WM_DESTROY:
{
PostQuitMessage(0);
}
return 1;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}