我可能会离开这里深处,所以如果我看起来完全迷失了,我很抱歉,但这只是因为我。 (但是,如果我从未超出我的深度,我想我永远不会学到任何东西)
我试图弄清楚如何在WPF控件中托管Win32窗口,但由于完全无法了解Windows API,我很难以基本方式与它进行交互。
目前,当我尝试将父窗口的HWND传递给方法" CreateWindow时,我收到了访问异常。"
这是我的代码:
///------------- VisualDerived.h -----------------
using namespace System::Runtime::InteropServices;
namespace POCPP
{
namespace WPF
{
namespace Controls
{
public ref class VisualDerived : System::Windows::Interop::HwndHost
{
private:
HWND *childWin;
protected:
virtual HandleRef BuildWindowCore(HandleRef trg) override;
virtual void DestroyWindowCore(HandleRef trg) override;
public:
VisualDerived();
};
}
}
}
// ------------------ VisualDerived.cpp -----------------------
#include "Stdafx.h"
#include <Windows.h>
#include <WinUser.h>
#include "VisualDerived.h"
#pragma comment(lib, "user32.lib")
HandleRef POCPP::WPF::Controls::VisualDerived::BuildWindowCore(HandleRef trg)
{
DWORD windowOptions = WS_CHILDWINDOW;
HWND *parentWindow = (HWND*)trg.Handle.ToPointer();
HWND chld = CreateWindow(NULL, NULL, windowOptions, 0, 0, 200, 200, *parentWindow, 0, 0, NULL); // throws access exception as is, returns null reference exception without the pointer to the parentWindow
return HandleRef(NULL, System::IntPtr(&chld));
}
void POCPP::WPF::Controls::VisualDerived::DestroyWindowCore(HandleRef trg)
{
}
POCPP::WPF::Controls::VisualDerived::VisualDerived()
{
}
无论如何,如果我的问题对于这里经验丰富的专业人士来说似乎不怎么样,我很抱歉。我远远不在我的舒适区域,不了解Windows API,也不了解C ++ / CLI。
但我决定学习如何做到这一点,所以任何帮助都会很棒。
答案 0 :(得分:2)
HWND *parentWindow = (HWND*)trg.Handle.ToPointer();
错误,因为Handle
是HWND
。将其更改为:
HWND parentWindow = (HWND)trg.Handle.ToPointer();
当您致电NULL
时,您正在传递CreateWindow
作为窗口类。你必须提供一个窗口类。
您的退货声明也是错误的。您正在返回本地变量的地址。它应该是:
return HandleRef(NULL, System::IntPtr(chld));