MFC activex控件获得dialog子窗口句柄

时间:2023-02-12 21:03:20
我新建了一个MFC activex 工程用来制作ocx;在里面我增加了一个dialog对话框,然后在对话框里增加一个button按钮,现在我的activex怎样才能拿到这个button的句柄,直接在dialog中拿到是可以的
HWND bb = NULL;
bb=aa->GetDlgItem( IDC_BUTTON1 )->m_hWnd;但是拿到了activex无法使用
[/size]

10 个解决方案

#1


自己顶 求大神帮忙

#2


或者告诉我怎么获得OCX 默认的窗口句柄,我现在要做的是拿到一个句柄,将视频流显示出来

#3


你要明白,Dialog和Button都是Window
所以如果有Dialog的WindowHandle,查找其所有子Window的WindowHandle可以
使用API FindWindow和FindWindowEx
参考下面:
HWND MyFindListViewWindow()
{
    const int MyMaxParentWinCount = 4;
    // 父窗口类名数组
    char *A_szClassName[MyMaxParentWinCount] = {
        "ThunderRT6FormDC",
        "ThunderRT6Frame",
        "ThunderRT6Frame",
        "ListView20WndClass"
    };
    // 父窗口标题数组
    char *A_szWinName[MyMaxParentWinCount] = {
        Title,
        "",
        "",
        ""
    };
    // 首先求得*父窗口
    HWND hMainWin = FindWindow(A_szClassName[0], A_szWinName[0]);
    if (NULL==hMainWin) {
        return NULL;
    }
    // 逐次用FindWindowEx函数求出各级子窗口
    HWND hNextChildWin=NULL;

    HWND hLastWin=NULL;
    for (int i=1; i<MyMaxParentWinCount; i++) {
        if (1==i) {
            hMainWin = FindWindowEx(hMainWin,NULL         ,A_szClassName[i],A_szWinName[i]);
        } else if (2==i) {
            hNextChildWin = FindWindowEx(hMainWin,hNextChildWin,A_szClassName[i],A_szWinName[i]);
            if (NULL==hNextChildWin) break;//
            hNextChildWin = FindWindowEx(hMainWin,hNextChildWin,A_szClassName[i],A_szWinName[i]);
            hLastWin=hNextChildWin;
        } else {
            hLastWin = FindWindowEx(hLastWin,NULL         ,A_szClassName[i],A_szWinName[i]);
        }
    }
    return hLastWin;
}

#4


推荐使用Spy4Win软件。

#5


不推荐LS的方法,active控件也可能是wndless的。不过控件总是由你的容器创建的,按理说有窗口的你直接就能获得activex控件的句柄,除非你是在activex内部在new了一个dlg出来,那如果这样的话你得抛出接口来供宿主程序操作了。

#6


控件增加一个属性或接口用来传递句柄,由Dlg传递到控件

#7


dialog只有被创建才会有句柄,所以创建时把它的指针记录下来,要取button时用,dialog->getdlgitem

#8


引用 5 楼 xuddk727 的回复:
不推荐LS的方法,active控件也可能是wndless的。不过控件总是由你的容器创建的,按理说有窗口的你直接就能获得activex控件的句柄,除非你是在activex内部在new了一个dlg出来,那如果这样的话你得抛出接口来供宿主程序操作了。

请问怎么抛出接口让主程序调用,我建的是MFC active,后来参照这篇文章http://blog.sina.com.cn/s/blog_7065a9de0100vmb1.html,然后想得到dialog中控件的句柄

#9


结贴,实现方法在dialog里 然后给activex接口

#10


该回复于2014-08-10 09:35:16被管理员删除

#1


自己顶 求大神帮忙

#2


或者告诉我怎么获得OCX 默认的窗口句柄,我现在要做的是拿到一个句柄,将视频流显示出来

#3


你要明白,Dialog和Button都是Window
所以如果有Dialog的WindowHandle,查找其所有子Window的WindowHandle可以
使用API FindWindow和FindWindowEx
参考下面:
HWND MyFindListViewWindow()
{
    const int MyMaxParentWinCount = 4;
    // 父窗口类名数组
    char *A_szClassName[MyMaxParentWinCount] = {
        "ThunderRT6FormDC",
        "ThunderRT6Frame",
        "ThunderRT6Frame",
        "ListView20WndClass"
    };
    // 父窗口标题数组
    char *A_szWinName[MyMaxParentWinCount] = {
        Title,
        "",
        "",
        ""
    };
    // 首先求得*父窗口
    HWND hMainWin = FindWindow(A_szClassName[0], A_szWinName[0]);
    if (NULL==hMainWin) {
        return NULL;
    }
    // 逐次用FindWindowEx函数求出各级子窗口
    HWND hNextChildWin=NULL;

    HWND hLastWin=NULL;
    for (int i=1; i<MyMaxParentWinCount; i++) {
        if (1==i) {
            hMainWin = FindWindowEx(hMainWin,NULL         ,A_szClassName[i],A_szWinName[i]);
        } else if (2==i) {
            hNextChildWin = FindWindowEx(hMainWin,hNextChildWin,A_szClassName[i],A_szWinName[i]);
            if (NULL==hNextChildWin) break;//
            hNextChildWin = FindWindowEx(hMainWin,hNextChildWin,A_szClassName[i],A_szWinName[i]);
            hLastWin=hNextChildWin;
        } else {
            hLastWin = FindWindowEx(hLastWin,NULL         ,A_szClassName[i],A_szWinName[i]);
        }
    }
    return hLastWin;
}

#4


推荐使用Spy4Win软件。

#5


不推荐LS的方法,active控件也可能是wndless的。不过控件总是由你的容器创建的,按理说有窗口的你直接就能获得activex控件的句柄,除非你是在activex内部在new了一个dlg出来,那如果这样的话你得抛出接口来供宿主程序操作了。

#6


控件增加一个属性或接口用来传递句柄,由Dlg传递到控件

#7


dialog只有被创建才会有句柄,所以创建时把它的指针记录下来,要取button时用,dialog->getdlgitem

#8


引用 5 楼 xuddk727 的回复:
不推荐LS的方法,active控件也可能是wndless的。不过控件总是由你的容器创建的,按理说有窗口的你直接就能获得activex控件的句柄,除非你是在activex内部在new了一个dlg出来,那如果这样的话你得抛出接口来供宿主程序操作了。

请问怎么抛出接口让主程序调用,我建的是MFC active,后来参照这篇文章http://blog.sina.com.cn/s/blog_7065a9de0100vmb1.html,然后想得到dialog中控件的句柄

#9


结贴,实现方法在dialog里 然后给activex接口

#10


该回复于2014-08-10 09:35:16被管理员删除