- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我不知道我应该用什么标题,但请阅读这个。
我正在制作一个在鼠标指针位置显示颜色的程序。我想使用 WM_INPUT,因为 WM_MOUSEMOVE 更新不够快。
这是我的一些主要代码。
#include <Windows.h>
#include <WindowsX.h>
/* void Cls_OnInput(HWND hWnd, UINT inputCode, HRAWINPUT hRawInput) */
#define HANDLE_WM_INPUT(hWnd, wParam, lParam, fn) \
((fn)((hWnd), GET_RAWINPUT_CODE_WPARAM(wParam), (HRAWINPUT)(lParam)), 0L)
static LPCTSTR main_window_class_name = TEXT("MainWindow");
static HDC hdc_screen;
static COLORREF color;
LRESULT CALLBACK MainWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL MainWindow_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct);
void MainWindow_OnDestroy(HWND hWnd);
void MainWindow_OnPaint(HWND hWnd);
void MainWindow_OnInput(HWND hWnd, UINT inputCode, HRAWINPUT hRawInput);
ATOM RegisterMainWindowClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(wcex);
wcex.style = 0;
wcex.lpfnWndProc = MainWindowProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = (HICON)LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_SHARED);
wcex.hCursor = (HCURSOR)LoadImage(NULL, IDC_ARROW, IMAGE_CURSOR, 0, 0, LR_SHARED);
wcex.hbrBackground = GetSysColorBrush(COLOR_BTNFACE);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = main_window_class_name;
wcex.hIconSm = wcex.hIcon;
return RegisterClassEx(&wcex);
}
HWND CreateMainWindow(HINSTANCE hInstance)
{
return CreateWindow(main_window_class_name, TEXT("WhatColor"), WS_CAPTION | WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, HWND_DESKTOP, NULL, hInstance, NULL);
}
LRESULT CALLBACK MainWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
HANDLE_MSG(hWnd, WM_CREATE, MainWindow_OnCreate);
HANDLE_MSG(hWnd, WM_DESTROY, MainWindow_OnDestroy);
HANDLE_MSG(hWnd, WM_PAINT, MainWindow_OnPaint);
HANDLE_MSG(hWnd, WM_INPUT, MainWindow_OnInput);
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
}
BOOL MainWindow_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)
{
RAWINPUTDEVICE rid[1];
UNREFERENCED_PARAMETER(lpCreateStruct);
rid[0].usUsagePage = 1;
rid[0].usUsage = 2;
rid[0].dwFlags = 0;
rid[0].hwndTarget = hWnd;
RegisterRawInputDevices(rid, 1, sizeof(rid[0]));
hdc_screen = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
return TRUE;
}
void MainWindow_OnDestroy(HWND hWnd)
{
UNREFERENCED_PARAMETER(hWnd);
DeleteDC(hdc_screen);
PostQuitMessage(EXIT_SUCCESS);
}
void MainWindow_OnPaint(HWND hWnd)
{
static PAINTSTRUCT ps;
BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
}
void MainWindow_OnInput(HWND hWnd, UINT inputCode, HRAWINPUT hRawInput)
{
static RAWINPUT raw_input;
static UINT raw_input_size = sizeof(raw_input);
static POINT point;
UNREFERENCED_PARAMETER(inputCode);
GetRawInputData(hRawInput, RID_HEADER, &raw_input, &raw_input_size, sizeof(raw_input.header));
if (raw_input.header.dwType == RIM_TYPEMOUSE)
{
GetCursorPos(&point);
color = GetPixel(hdc_screen, point.x, point.y);
DeleteBrush(SetClassLong(hWnd, GCL_HBRBACKGROUND, (LONG)CreateSolidBrush(color)));
InvalidateRect(hWnd, NULL, TRUE);
}
}
问题是程序似乎一次又一次地处理 WM_INPUT 消息,并且主窗口卡住了。如果我删除
color = GetPixel(hdc_screen, point.x, point.y);
窗口正常,但取不到我想要的颜色。
我认为如果您尝试测试我的代码会更好。
我应该怎么做才能解决这个问题?
最佳答案
我将使用 Timer 来处理 WM_TIMER
消息。
关于c - 关于 WM_INPUT 和 GetPixel 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10676054/
我想捕捉发送到我的窗口的按键以存储每个键的状态,并区分键的左右实例,如 WM_LCONTROL 和 WM_RCONTROL. 因为 WM_KEYUP/DOWN 不提供此功能,所以我转向原始输入,我需要
精简版: 在我正在测试的系统中,USB 设备和电缆应始终连接在相同的连接器上,因此在 USBview 应用程序中查看时,USB 树看起来应该始终相同。但由于我没有从该树中识别设备的信息,我仍然无法判断
我刚开始在我的应用中使用原始输入。直接进入问题,在遗留 WM_KEYDOWN 消息中,可以检查 lParam 以获得有关按键的额外信息。像这些- Bits Meaning 0-15
关于 我正在尝试为 Unity 构建自定义鼠标输入,以直接从 HID 获取数据。我这样做是因为我想尝试为我提供原始鼠标输入的 Unity API 是否有任何差异(当使用我自己的自定义鼠标输入时)。 另
我正在尝试向应用程序发送 WM_INPUT 消息,但我遇到了一些未能解决的障碍。我创建了如下所示的 RAWINPUT 结构: //try sending 'W' RAWINPUT raw =
我不知道我应该用什么标题,但请阅读这个。 我正在制作一个在鼠标指针位置显示颜色的程序。我想使用 WM_INPUT,因为 WM_MOUSEMOVE 更新不够快。 这是我的一些主要代码。 #include
当在 WM_INPUT 事件中读取鼠标位置时,鼠标光标被隐藏,当通过远程桌面使用应用程序时,SetCursorPos 似乎不起作用。 当应用程序不通过远程桌面使用时,同样的代码也能正常工作。即,我可以
我正在使用原始输入来处理通用设备的输入,到目前为止,我的所有测试用例都有效(键盘、游戏 handle 和鼠标),但我的笔记本电脑触控板给我带来了一个奇怪的问题。当我得到 WM_INPUT来自触控板的消
有谁知道如何使用 Raw Input从 WX Python 应用程序在 Windows 上运行? 我需要做的是能够区分来自多个键盘的输入。因此,如果有另一种方法可以实现这一目标,那也行得通。 最佳答案
[编辑] 到目前为止,这是我收集到的有关鼠标输入处理的信息。请注意,我是通过许多不同的来源和实验了解到这一点的,所以不要把它当作福音:1)鼠标事件起源于鼠标移动2) SetWindowsHookEx(
我正在编写一个应用程序来控制 Windows 7,尤其是 Windows Media Center。我可以发送击键、执行命令等,但我想模拟 Media Center Remote 上的一些按钮。 其中
我需要编写一个程序来修改Windows下某个 usb hid键盘(条码扫描器)的输入。应适用以下工作流程: 监听来自设备的输入 -> 记录输入 -> 停止输入到达事件应用程序 -> 处理记录的输入并将
我是一名优秀的程序员,十分优秀!