C++ 为什么GetDC为同一对象返回不同的值?

C++ 为什么GetDC为同一对象返回不同的值?,c++,winapi,C++,Winapi,我正在使用此代码获取当前鼠标位置的对象/窗口的设备上下文(也称为DC) POINT curPos; while (1) { GetCursorPos(&curPos); printf("hdc: %ld\n", GetDC(WindowFromPoint(curPos))); Sleep(300); } 编译和执行之后,我将鼠标放在控制台上,不移动鼠标,一直打印不同的值(也是负数)。例如: hdc: -1795094423 hdc: -1425992173 h

我正在使用此代码获取当前鼠标位置的对象/窗口的
设备上下文
(也称为DC)

POINT curPos;

while (1)
{
    GetCursorPos(&curPos);
    printf("hdc: %ld\n", GetDC(WindowFromPoint(curPos)));
    Sleep(300);
}
编译和执行之后,我将鼠标放在控制台上,不移动鼠标,一直打印不同的值(也是负数)。例如:

hdc: -1795094423
hdc: -1425992173
hdc: 1090588133
hdc: 553717209
hdc: 1979782668
hdc: 2013337074
hdc: -1241444488
我知道我可以使用
GetWindowDC
获取特定窗口的
DC
,但我想获取该窗口特定部分的
DC


提前感谢。

如果不发布任何HDC,您通常不会一次又一次地检索大量HDC。在抓取另一个之前试着释放它们,看看会发生什么

无论如何,他们没有理由是一样的。事实上,在不释放它们的情况下,它们必须是不同的数字,因为每个数字都是不同对象的句柄

至于数字是“负数”,那根本不重要。它们真的应该打印为十六进制

#include <windows.h>
#include <stdio.h>

int main() {
  POINT curPos;
  while (1)
  {
    GetCursorPos(&curPos);
    HWND hwnd = WindowFromPoint(curPos);
    HDC hdc = GetDC(hwnd);
    printf("hdc: %08lX\n", (unsigned long)hdc);
    ReleaseDC(hwnd, hdc);
    Sleep(1000);
  }
  return 0;
}
#包括
#包括
int main(){
curPos点;
而(1)
{
GetCursorPos(&curPos);
HWND HWND=窗口起点(curPos);
HDC HDC=GetDC(hwnd);
printf(“hdc:%08lX\n”,(无符号长)hdc);
释放DC(hwnd、hdc);
睡眠(1000);
}
返回0;
}

通常,在不发布任何HDC的情况下,您不会一次又一次地检索大量HDC。在抓取另一个之前试着释放它们,看看会发生什么

无论如何,他们没有理由是一样的。事实上,在不释放它们的情况下,它们必须是不同的数字,因为每个数字都是不同对象的句柄

至于数字是“负数”,那根本不重要。它们真的应该打印为十六进制

#include <windows.h>
#include <stdio.h>

int main() {
  POINT curPos;
  while (1)
  {
    GetCursorPos(&curPos);
    HWND hwnd = WindowFromPoint(curPos);
    HDC hdc = GetDC(hwnd);
    printf("hdc: %08lX\n", (unsigned long)hdc);
    ReleaseDC(hwnd, hdc);
    Sleep(1000);
  }
  return 0;
}
#包括
#包括
int main(){
curPos点;
而(1)
{
GetCursorPos(&curPos);
HWND HWND=窗口起点(curPos);
HDC HDC=GetDC(hwnd);
printf(“hdc:%08lX\n”,(无符号长)hdc);
释放DC(hwnd、hdc);
睡眠(1000);
}
返回0;
}

通常,在不发布任何HDC的情况下,您不会一次又一次地检索大量HDC。在抓取另一个之前试着释放它们,看看会发生什么

无论如何,他们没有理由是一样的。事实上,在不释放它们的情况下,它们必须是不同的数字,因为每个数字都是不同对象的句柄

至于数字是“负数”,那根本不重要。它们真的应该打印为十六进制

#include <windows.h>
#include <stdio.h>

int main() {
  POINT curPos;
  while (1)
  {
    GetCursorPos(&curPos);
    HWND hwnd = WindowFromPoint(curPos);
    HDC hdc = GetDC(hwnd);
    printf("hdc: %08lX\n", (unsigned long)hdc);
    ReleaseDC(hwnd, hdc);
    Sleep(1000);
  }
  return 0;
}
#包括
#包括
int main(){
curPos点;
而(1)
{
GetCursorPos(&curPos);
HWND HWND=窗口起点(curPos);
HDC HDC=GetDC(hwnd);
printf(“hdc:%08lX\n”,(无符号长)hdc);
释放DC(hwnd、hdc);
睡眠(1000);
}
返回0;
}

通常,在不发布任何HDC的情况下,您不会一次又一次地检索大量HDC。在抓取另一个之前试着释放它们,看看会发生什么

无论如何,他们没有理由是一样的。事实上,在不释放它们的情况下,它们必须是不同的数字,因为每个数字都是不同对象的句柄

至于数字是“负数”,那根本不重要。它们真的应该打印为十六进制

#include <windows.h>
#include <stdio.h>

int main() {
  POINT curPos;
  while (1)
  {
    GetCursorPos(&curPos);
    HWND hwnd = WindowFromPoint(curPos);
    HDC hdc = GetDC(hwnd);
    printf("hdc: %08lX\n", (unsigned long)hdc);
    ReleaseDC(hwnd, hdc);
    Sleep(1000);
  }
  return 0;
}
#包括
#包括
int main(){
curPos点;
而(1)
{
GetCursorPos(&curPos);
HWND HWND=窗口起点(curPos);
HDC HDC=GetDC(hwnd);
printf(“hdc:%08lX\n”,(无符号长)hdc);
释放DC(hwnd、hdc);
睡眠(1000);
}
返回0;
}


我的猜测是,该窗口被定义为使用池中的公共DC,因此每次调用GetDC()时都会返回不同的DC。谢谢您的回答。但所有窗口都会发生这种情况,桌面也是如此。如果给定的窗口定义为使用类DC或专用DC,则不应该发生这种情况,在这种情况下,GetDC()每次都会返回相同的DC。我猜该窗口定义为使用共用的DC,因此GetDC()每次调用时都会返回不同的DC。谢谢您的回答。但所有窗口都会发生这种情况,桌面也是如此。如果给定的窗口定义为使用类DC或专用DC,则不应该发生这种情况,在这种情况下,GetDC()每次都会返回相同的DC。我猜该窗口定义为使用共用的DC,因此GetDC()每次调用时都会返回不同的DC。谢谢您的回答。但所有窗口都会发生这种情况,桌面也是如此。如果给定的窗口定义为使用类DC或专用DC,则不应该发生这种情况,在这种情况下,GetDC()每次都会返回相同的DC。我猜该窗口定义为使用共用的DC,因此GetDC()每次调用时都会返回不同的DC。谢谢您的回答。但所有窗口都会出现这种情况,桌面也是如此。如果给定的窗口定义为使用类DC或专用DC,则不应该出现这种情况,在这种情况下,GetDC()每次都会返回相同的DC。发布的好处是,我没有注意到这一点。如果窗口使用类DC或私有DC,则不需要释放它,但GetDC()每次都将返回相同的HDC。但是,如果窗口使用的是公共DC,那么它将从系统池中提取,因此释放非常重要,否则GetDC()每次都必须提取不同的HDC,因为早期的HDC仍在使用。是的,释放是关键。我试过了,效果很好,但对于同一个对象,它在前2秒钟打印一个数字,然后再打印另一个数字,直到永远。你能试试这个代码并告诉我你是否看到同样的行为吗?编辑:现在我再次运行此操作,每次在窗口上设置光标,然后返回到原始值时,数字都会发生变化。@cdonts DC的数值不重要。你不应该在意一个DC是否恰好和一个早期的DC有相同的数值