我正在使用Visual C++ 2008编写Windows应用程序,想要在其中嵌入Windows自带的计算器(calc.exe)。请问是否有可能实现这一目标,并且如果可以的话,你能给我一些提示吗?
是的,您可以将计算器嵌入到自己的应用程序中,但它仍将在自己的进程空间中运行。可能还会受到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);
}
}
微软有多种技术来支持嵌入,最著名的是基于COM的OLE技术。例如,这就是你如何在应用程序中嵌入Excel电子表格。然而,我相当确定calc没有实现任何所需的接口。
因此,只留下了一些hacky解决方案,比如尝试自己启动并玩弄窗口层次结构,或者尝试向用户展示它,然后通过剪贴板复制结果等。这在技术上都是可能的,但不是一个好主意。事实上,这可能比编写自己的计算器应用程序更困难,这取决于您想让用户做什么。如果您解释一下为什么要这样做,某人可能会提出更好的解决方案。