【问题标题】:Calling GetDesktopWindow() function in winuser.h instead of CWnd::GetDesktopWindow() in an MFC OnButtonClick function在 winuser.h 中调用 GetDesktopWindow() 函数,而不是在 MFC OnButtonClick 函数中调用 CWnd::GetDesktopWindow()
【发布时间】:2021-11-14 04:01:56
【问题描述】:

为了我自己的学习,我正在玩一些在线示例的代码sn-ps。

在这些示例的开头,有以下几行:

HWND hDesktopWnd = GetDesktopWindow();
HDC hDesktopDC = GetDC(hDesktopWnd);

为方便起见,我在基于对话框的演示 MFC 项目中添加了一个新按钮,并且我希望测试的代码被写入 ::OnBnClickedRuntest() 函数。

这在过去运行良好,我以这种方式研究、修改和测试了各种其他代码 sn-ps。但是,对于这些行,我收到 E0144 编译时错误:

“CWnd *”类型的值不能用于初始化“HWND”类型的实体

我认为我遇到了某种名称匹配/可见性问题。我希望调用winuser.h 中定义的GetDesktopWindow()GetDC(),但显然CWnd 类也具有这些完全相同的名称和不同的返回类型的方法。

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdesktopwindow

https://docs.microsoft.com/en-us/cpp/mfc/reference/cwnd-class?view=msvc-160#getdesktopwindow

显然,我的测试代码被放置在 MFC 对话框的 OnButtonClicked 函数中,GetDesktopWindow()GetDC() 更喜欢调用 CWnd::GetDesktopWindow()CWnd::GetDC() 方法,而不是预期的 winuser.h 函数。

如何向编译器说明我想使用 winuser.h 同名函数而不是 CWnd 方法?

【问题讨论】:

  • 在 MFC 中你可以使用CClientDC dc(GetDesktopWindow());CClientDC 致电 GetDC/ReleaseDC。但是使用解析运算符调用核心函数也很有用。

标签: c++ visual-studio visual-c++ mfc


【解决方案1】:

在函数上使用范围解析运算符:

::GetDesktopWindow();
::GetDC();

【讨论】:

  • 这就是我所缺少的!我知道如果情况相反,我可以通过调用 CWnd::GetDesktopWindow 来强制使用类方法。我不知道的是强制非类函数的方法是简单地写双分号。而且我什至不知道如何为搜索引擎表达这个问题。
  • Ed,我不得不等待 10 分钟才能接受答案。在此之前门户网站不允许我这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多