如何通过在visual c ++中扩展CWnd类来创建隐藏窗口

时间:2014-11-18 00:57:22

标签: winapi visual-c++ win32gui

任何人都可以通过扩展CWnd类来帮助我创建一个隐藏窗口。我是Windows编程的新手。 我尝试创建一个,但问题是在尝试注册窗口类或创建窗口时代码崩溃。

class HiddenWindow : public CWnd
{
public:
   HiddenWindow();
   ~HiddenWindow();
protected:
   afx_msg LRESULT DoNOOP(WPARAM wParam, LPARAM lParam);
   DECLARE_MESSAGE_MAP()

};
This is my .cpp file

HiddenWindow::HiddenWindow()
{
   CString wcn = ::AfxRegisterWndClass(NULL);//code fails here because of AfxGetInstanceHandle( )
   BOOL created = this->CreateEx(0, wcn, _T("YourHiddenWindowClass"), 0, 0, 0, 0, NULL,HWND_MESSAGE,0);
}


HiddenWindow::~HiddenWindow()
{
}

BEGIN_MESSAGE_MAP(HiddenWindow, CWnd)
ON_MESSAGE(WM_USER + 1, DoNOOP)
END_MESSAGE_MAP()

LRESULT HiddenWindow::DoNOOP(WPARAM wParam, LPARAM lParam)
{
   AfxMessageBox(_T("Test"));
   return LRESULT(true);
}

2 个答案:

答案 0 :(得分:1)

我在MFC中通过覆盖Create,构造函数来完成此操作 太早了 试试:

BOOL HiddenWindow::Create()
{  
    if (!CWnd::CreateEx(0, AfxRegisterWndClass(0),
        _T("HiddenWindow Notification Sink"),
        WS_OVERLAPPED, 0, 0, 0, 0, NULL, NULL))
    {
        TRACE0("Warning: unable to create HiddenWindow window!\n");
        return FALSE;
    }
    return TRUE;
}

答案 1 :(得分:0)

你不是

  

“扩展CWnd类”

您使用的是C ++而不是C#,因此您派生类。

如果您需要基本功能,则无需执行此操作。只需调用您需要的创建传递窗口样式而不需要WS_VISIBLE,就像您所做的那样。但是,您必须提供窗口类作为参数,因为您的窗口不是子窗口。

如果您需要处理消息或需要实现不同的默认行为,则必须派生自己的类,但仍然不必覆盖Create成员。

除了在构造函数中初始化成员变量之外,你不应该做任何事情。你永远不应该尝试分配内存或调用可能分配内存的其他函数。你不应该做任何可能导致不可挽回的错误的事情。如果承包商失败,就没有办法优雅退出。