2011-09-25 77 views
1

我之前就这个问题提出了两个问题,每个帖子都有我尝试过的一些解决方案,但问题仍然存在。在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. 
} 
+0

这里有听到我的故事吗? :D –

+0

对不起,又是什么问题? – djeidot

+0

那么,如果它是一个无窗口的ActiveX控件,它自然不会有任何窗口句柄。你需要什么手柄?有很多COM接口可以让你在没有窗口句柄的情况下实现。请明确说明。 – aquaherd

回答

0

正如你所说,你需要一个窗口句柄可以通过它接收用户消息,你总是可以选择创建一个帮助窗口,比如只有消息窗口,参见Using CreateWindowEx to Make a Message-Only Window

对于无窗控制,根本没有任何窗口句柄是可以的,所以除非你自己拥有一个窗口,否则你不能真正依赖句柄的可用性。

+0

所以我如何通过创建的窗口以这种方式处理消息? –

+0

与任何窗口一样 - 定义处理程序并让它们调用。第一次偶然的谷歌结果给了我这一个:[如何使一个消息窗口](http://www.codeproject.com/KB/dialog/messageonly.aspx),它显示了一个窗口类“CMyMessageOnlyWindowClass”这是关于你需要什么,在MFC中。 ATL代码可能会更简单。 –

+0

非常感谢你Roman Roman R. –