在Windows操作系统中,是否可能将一个应用程序嵌入到另一个应用程序中?

5

我正在使用Visual C++ 2008编写Windows应用程序,想要在其中嵌入Windows自带的计算器(calc.exe)。请问是否有可能实现这一目标,并且如果可以的话,你能给我一些提示吗?


1
你的意思是将计算器窗口嵌入到你自己的窗口中吗?还是将可执行文件嵌入到你自己的可执行文件中? - Lasse V. Karlsen
我的意思是将计算器窗口嵌入到我的窗口中。 - bodacydo
2个回答

7

是的,您可以将计算器嵌入到自己的应用程序中,但它仍将在自己的进程空间中运行。可能还会受到UAC的一些限制,但这取决于如何启动计算器。您只需要更改主要计算器窗口的父级并将其样式更改为WS_CHILD。

void EmbedCalc(HWND hWnd)
{
    HWND calcHwnd = FindWindow(L"CalcFrame", NULL);
    if(calcHwnd != NULL)
    {
        // Change the parent so the calc window belongs to our apps main window 
        SetParent(calcHwnd, hWnd);

        // Update the style so the calc window is embedded in our main window
        SetWindowLong(calcHwnd, GWL_STYLE, GetWindowLong(calcHwnd, GWL_STYLE) | WS_CHILD);

        // We need to update the position as well since changing the parent does not
        // adjust it automatically.
        SetWindowPos(calcHwnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
    }
}

2
它不必在单独的进程中运行。您可以使用Spy++来了解窗口结构,然后可以使用DLL注入(http://en.wikipedia.org/wiki/DLL_injection)将任意代码和行为加载到Calc中,挂钩窗口所有权和父级关系。 - Scott Jones
请查看问题的评论。请求是将Calc嵌入到OP应用程序的窗口中。没有提到向Calc添加功能。 - Captain Obvlious
是的,那就是我回答的问题 - “将计算器窗口嵌入我的窗口中”。流程问题是另一回事。 - Scott Jones

3

微软有多种技术来支持嵌入,最著名的是基于COM的OLE技术。例如,这就是你如何在应用程序中嵌入Excel电子表格。然而,我相当确定calc没有实现任何所需的接口。

因此,只留下了一些hacky解决方案,比如尝试自己启动并玩弄窗口层次结构,或者尝试向用户展示它,然后通过剪贴板复制结果等。这在技术上都是可能的,但不是一个好主意。事实上,这可能比编写自己的计算器应用程序更困难,这取决于您想让用户做什么。如果您解释一下为什么要这样做,某人可能会提出更好的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接