Direct2D(XAML)应用中调用::RegisterWindowMessage()出现编译错误
解决Direct2D(XAML)应用引入Windows.h后的编译错误问题
我之前在VS2012的Direct2D(XAML)项目里也踩过这个坑,直接引入Windows.h确实容易和XAML的运行时头文件产生冲突,咱们一步步来解决:
1. 先解决头文件冲突问题
XAML应用默认依赖Windows运行时的C++/CX扩展头文件,这些和传统Win32的Windows.h在宏定义、类型上有不少重叠冲突。你可以在引入Windows.h之前添加两个宏来精简Windows.h的内容,避免冲突:
#define WIN32_LEAN_AND_MEAN // 排除Win32里的冗余组件 #define NOMINMAX // 禁用min/max宏,避免和C++标准库冲突 #include <Windows.h>
如果还是有冲突,建议把涉及Win32窗口消息的代码单独放在一个.cpp文件里,然后给这个文件禁用C++/CX扩展:
- 右键该文件 → 属性 → C/C++ → 常规 → 编译为 → 选择「不使用托管扩展」
- 这样可以彻底隔离C++/CX和Win32代码的冲突,只需要在主XAML代码里调用这个文件里的函数即可。
2. 正确获取窗口句柄并发送消息
在XAML应用里,不能像传统Win32那样直接用全局窗口句柄,得先获取CoreWindow的句柄:
#include <Windows.h> #include <Windows.UI.Core.h> // 先注册自定义消息(建议放在全局或静态位置) UINT g_customMsg = RegisterWindowMessage(L"MyRegisteredMessage"); void SendMyCustomMessage() { // 获取当前线程的CoreWindow句柄 HWND hwnd = reinterpret_cast<HWND>(Windows::UI::Core::CoreWindow::GetForCurrentThread()->WindowHandle); if (hwnd && g_customMsg != 0) { // 发送消息,这里用SendMessage或者PostMessage都可以 SendMessage(hwnd, g_customMsg, 0, 0); } }
然后在按钮点击事件里直接调用SendMyCustomMessage()就行。
3. 检查预编译头的影响
如果你的项目用了预编译头(pch.h),建议把带宏定义的Windows.h引入放在预编译头里,而不是在单个cpp文件里重复引入,这样能保证所有文件的头文件引入顺序一致,减少冲突概率。
内容的提问来源于stack exchange,提问作者Catachan
相关产品推荐
相关产品推荐

