【问题标题】:how to create a hidden window by extending CWnd class in visual c++如何通过在 Visual C++ 中扩展 CWnd 类来创建隐藏窗口
【发布时间】:2014-11-18 00:57:21
【问题描述】:

任何人都可以通过扩展 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);
}

【问题讨论】:

  • 创建隐藏窗口通常只是首先不显示它(例如不调用ShowWindow)。如果您遇到特殊问题,请显示一些代码。
  • @JonathanPotter:你好乔纳森,我发布了我尝试过的代码,它在 AfxRegisterWndClass(NULL) 失败,因为它是内部断言的。
  • 告诉我们你得到了 ASSERT!
  • 这听起来像您正在实例化一个具有静态存储持续时间的HiddenWindow-object。具有静态存储持续时间的对象在执行进入您的 main/WinMain 函数之前被初始化。对于 MFC 来说,这可能为时过早,无法完全初始化其所需状态。

标签: winapi visual-c++ win32gui


【解决方案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;
}

【讨论】:

  • @Kjell Gunnar:我的问题是我的 Visual Studio 的项目设置不正确,我可以通过创建一个新的 MFC 项目来解决它。
  • @suj 很高兴听到您的问题得到解决!但是,您不应该做在构造函数中可能会失败的事情,因为没有办法返回错误的状态。
  • 这是非常错误的建议,Kjell:构造函数可能会失败并通过抛出异常来报告错误。任何遵循 RAII 习语的系统都将具有带有抛出构造函数的类。
【解决方案2】:

你不是

"扩展 CWnd 类"

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

如果您需要基本功能,您实际上不必这样做。就像你做的那样,只需在没有 WS_VISIBLE 的情况下调用创建你需要的传递窗口样式。但是,您必须提供窗口类作为参数,因为您的窗口不是子窗口。

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

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

【讨论】:

    猜你喜欢
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多