在MFC Windowless Activex中无法获取Cwnd类的句柄?
我之前就这个问题提出了两个问题,每个帖子都有我尝试过的一些解决方案,但问题仍然存在。在MFC Windowless Activex中无法获取Cwnd类的句柄?
我的第一个问题是:为什么无窗口的Activex不返回句柄。该建议是“改变创作设置的化妆窗户激活的时候,我已经尝试过了,但仍然m_hWnd
属性返回零GetSafeHwnd()
方法一样。
第二个是同样的问题,这一个专注于COleControl类,它是祖先CWnd。解决方案是这样的“在您的控制初始化代码中的某处创建隐形窗口。 。处理发送到该窗口的消息,并直接调用控制方法”,所以我这样做,但创建的类仍返回零手柄
这里是我的新隐形类来源:
// moWind.cpp : implementation file
//
#include "stdafx.h"
#include "PINActive.h"
#include "moWind.h"
#include "include\xfspin.h"
#include <math.h>
// moWind
IMPLEMENT_DYNAMIC(moWind, CWnd)
moWind::moWind(){}
moWind::~moWind(){}
//=============================================================
LRESULT moWind::OnExecuteEvent (WPARAM wParam, LPARAM lParam)
{
WFSRESULT *pResult = (WFSRESULT *)lParam;
CString EK=_T("");
CString str;
int reskey=0;
if (pResult->u.dwEventID=WFS_EXEE_PIN_KEY)
{
LPWFSPINKEY pressedkey;
pressedkey=(LPWFSPINKEY)pResult->lpBuffer;
reskey = log10((double)pressedkey->ulDigit)/log10((double)2);
EK.Format("%d",reskey);
xfsOnKeyEvent->OnKeyRecieved(reskey);
}
else
{
str.Format("ExecuteEvent: ID = %d\r\n", pResult->u.dwEventID);
}
MessageBox("a Execute message Recieved");
return 0;
}
BEGIN_MESSAGE_MAP(moWind, CWnd)
ON_MESSAGE(WFS_EXECUTE_EVENT,OnExecuteEvent)
END_MESSAGE_MAP()
这是类的.h文件中:
// moWind.h
class IXFSEvents
{
protected:
IXFSEvents(){};
virtual ~IXFSEvents(){};
public:
virtual void OnKeyRecieved(int key)=0;
};
class moWind : public CWnd
{
DECLARE_DYNAMIC(moWind)
public:
moWind();
virtual ~moWind();
void Register(IXFSEvents* obj)
{
xfsOnKeyEvent= obj;
}
protected:
IXFSEvents* xfsOnKeyEvent;
LRESULT OnExecuteEvent (WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
};
,并在这里结束我在我的ActiveX使用这个类这样的方式:在myActivex.h文件 :
包括“moWind.h”
class CmyActivexCtrl : public COleControl, public IXFSEvents
{
...
Class definition
...
protected:
moWind tmpWind;
.
.
};
在我初始化了组件回调方法的myActivex的创建方法
终于想获得它的句柄,因为这:
CmyActivexCtrl::CmyActivexCtrl()
{
InitializeIIDs(&IID_DmyActivex, &IID_DmyActivexEvents);
tmpWind.Register(this);
myOtherComponent.WindowsHandle=tmpWind.GetSafeHwnd(); //here my Cwnd derived class returns zero
//my other component gets the handle and call an API with it to register
//the given handle and force the API to send the messages to that handle.
}
正如你所说,你需要一个窗口句柄可以通过它接收用户消息,你总是可以选择创建一个帮助窗口,比如只有消息窗口,参见Using CreateWindowEx to Make a Message-Only Window。
对于无窗控制,根本没有任何窗口句柄是可以的,所以除非你自己拥有一个窗口,否则你不能真正依赖句柄的可用性。
所以我如何通过创建的窗口以这种方式处理消息? –
与任何窗口一样 - 定义处理程序并让它们调用。第一次偶然的谷歌结果给了我这一个:[如何使一个消息窗口](http://www.codeproject.com/KB/dialog/messageonly.aspx),它显示了一个窗口类“CMyMessageOnlyWindowClass”这是关于你需要什么,在MFC中。 ATL代码可能会更简单。 –
非常感谢你Roman Roman R. –
这里有听到我的故事吗? :D –
对不起,又是什么问题? – djeidot
那么,如果它是一个无窗口的ActiveX控件,它自然不会有任何窗口句柄。你需要什么手柄?有很多COM接口可以让你在没有窗口句柄的情况下实现。请明确说明。 – aquaherd