这是我在这个论坛上发表的第一篇文章,如果我没有在正确的地方发帖或者我做错了什么,请不要狠狠地对我说,我不会在论坛上发帖。所以,我有GetPixel函数的这个问题。基本上,它应该返回x,y处的颜色小数。我即将发布的代码在windows 7 32bit上运行完美,但最近我买了一台新的笔记本电脑y50-70,windows 8.1 64bit,相同的代码完全不同。我找不到任何问题的解决方案,甚至无法描述它。我认为它可能与桌面句柄,HDC,GetDC(),GetPixel()有关,甚至可能与我的计算机分辨率,刷新率或类似的东西...我甚至录制了一些可以帮助你理解的视频我遇到的问题,因为我甚至无法正确描述它。这就像真正的颜色是x = 219,y = 407远离我鼠标指向的地方。新的笔记本电脑已经有3周了,我甚至尝试过1次系统还原,但这并没有解决问题。
随意使用此代码,希望它能为您解决问题:
#include <iostream>
#include <Windows.h>
using namespace std;
void Detect();
int main()
{
Detect();
return 0;
}
void Detect()
{
POINT p;
HDC hDC = GetDC(0);
int x, y;
while (!GetAsyncKeyState(VK_INSERT)) // Press insert to stop
{
GetCursorPos(&p);
x = p.x;
y = p.y;
hDC = GetDC(0);
cout << x << " " << y << " " << GetPixel(hDC, x, y) << endl;
Sleep(50);
}
ReleaseDC(0, hDC);
}
以下问题的链接: https://youtu.be/q2H2M8WLHVI https://youtu.be/UcneHwXaGoM
如果有人至少能以某种方式提供帮助或告诉我该做什么,去哪里,我会非常,非常非常适应它。我开始编程的主要原因之一是因为这样的事情,使用颜色,条件等等......现在我无法进一步前进,这真的很难过。希望听到回复。谢谢。
答案 0 :(得分:3)
这可能是DPI扩展的一个问题。
如果您的新显示器的每英寸点数高于平均值,则默认情况下,Windows会拉伸图形。默认情况下,Windows假定程序忽略DPI。如果Windows没有拉伸图形,那么没有针对DPI进行调整的程序将在高密度显示器的微小窗口中显示微小文本。
这有点像黑客。一些允许您询问显示和窗口的Windows API和消息将转换平均值和#34;之间的坐标。每英寸96像素,无论显示器的实际DPI是多少。同样,允许您调整大小的API会执行相反的转换。所以这对程序来说基本上都是透明的。但它并不完美,因为并非所有的API都能以一致的方式进行扩展。
所以我的猜测是你的笔记本电脑有一个高分辨率显示器,GetPixel不会转换DPI缩放的坐标,并且鼠标位置被转换为DPI缩放。结果是您要求的像素与鼠标无法匹配。
我建议的解决方案是告诉窗口您的程序是&#34; DPI-aware&#34;。有几种方法可以做到这一点。最简单的方法可能是在程序开头调用SetProcessDPIAware。您也可以在清单中标记您的程序。根据您使用的编译器,可能会有一个命令行选项来自动创建您需要的清单。
答案 1 :(得分:0)
另一个对我有用的替代方法是更改控制面板中的设置,以禁用每个设备的DPI缩放。你在运行多台显示器吗?
Win 8.1在控制面板中引入了一个新设置,其中显示&#34;让我为所有显示选择一个DPI缩放&#34;。通过defualt这是关闭。打开它对我有用。
观看此视频以查找设置: https://www.youtube.com/watch?v=sE3IUTPy1WA
我很好奇,所以当你不使用SetProccesDPIAware()
时,请告诉我这是否适合你