gpt4 book ai didi

c - WinAPI 获取鼠标光标图标

转载 作者:可可西里 更新时间:2023-11-01 14:13:56 26 4
gpt4 key购买 nike

我想获取 Windows 中的光标图标。我认为我使用的语言在这里不是很重要,所以我将只编写带有我尝试使用的 WinAPI 函数的伪代码:

c = CURSORINFO.new(20, 1, 1, POINT.new(1,1));
GetCursorInfo(c); #provides correctly filled structure with hCursor

DrawIcon(GetWindowDC(GetForegroundWindow()), 1, 1, c.hCursor);

所以这部分工作正常,它在事件窗口上绘制当前光标。但这不是我想要的。我想得到一个像素数组,所以我应该在内存中绘制它。

我正在尝试这样做:

hdc = CreateCompatibleDC(GetDC(0)); #returns non-zero int
canvas = CreateCompatibleBitmap(hdc, 256, 256); #returns non-zero int too

c = CURSORINFO.new(20, 1, 1, POINT.new(1,1));
GetCursorInfo(c);

DrawIcon(hdc, 1, 1, c.hCursor); #returns 1
GetPixel(hdc, 1, 1); #returns -1

为什么 GetPixel() 不返回 COLORREF?我错过了什么?

我对 WinAPI 不是很有经验,所以我可能犯了一些愚蠢的错误。

最佳答案

您必须选择您创建的位图到设备上下文中。如果没有,GetPixel function将返回 CLR_INVALID (0xFFFFFFFF):

A bitmap must be selected within the device context, otherwise, CLR_INVALID is returned on all pixels.

此外,您显示的伪代码严重泄漏了对象。无论何时调用 GetDC,您必须在使用完后调用 ReleaseDC。并且无论何时创建 GDI 对象,都必须在使用完毕后将其销毁。

最后,您似乎假设原点(即左上角点)的坐标为 (1, 1)。它们实际上是 (0, 0)。

这是我要编写的代码(为简洁起见省略了错误检查):

// Get your device contexts.
HDC hdcScreen = GetDC(NULL);
HDC hdcMem = CreateCompatibleDC(hdcScreen);

// Create the bitmap to use as a canvas.
HBITMAP hbmCanvas = CreateCompatibleBitmap(hdcScreen, 256, 256);

// Select the bitmap into the device context.
HGDIOBJ hbmOld = SelectObject(hdcMem, hbmCanvas);

// Get information about the global cursor.
CURSORINFO ci;
ci.cbSize = sizeof(ci);
GetCursorInfo(&ci);

// Draw the cursor into the canvas.
DrawIcon(hdcMem, 0, 0, ci.hCursor);

// Get the color of the pixel you're interested in.
COLORREF clr = GetPixel(hdcMem, 0, 0);

// Clean up after yourself.
SelectObject(hdcMem, hbmOld);
DeleteObject(hbmCanvas);
DeleteDC(hdcMem);
ReleaseDC(hdcScreen);

但最后一个警告——DrawIcon function 可能不会像您预期的那样工作。它仅限于以默认大小绘制图标或光标。在大多数系统上,这将是 32x32。来自文档:

DrawIcon draws the icon or cursor using the width and height specified by the system metric values for icons; for more information, see GetSystemMetrics.

相反,您可能想使用 DrawIconEx function .以下代码将在资源的实际大小处绘制光标:

DrawIconEx(hdcMem, 0, 0, ci.hCursor, 0, 0, 0, NULL, DI_NORMAL);

关于c - WinAPI 获取鼠标光标图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10469538/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com