3

我正在尝试使用ShellExecute在 Excel 中打开文件。我在 MSDN 论坛上阅读了有关该功能的信息,并找到了有关句柄的以下信息,这是第一个参数:

“hwnd [in] 用于显示用户界面 (UI) 或错误消息的所有者窗口的句柄。如果操作与窗口无关,则此值可以为 NULL。”

我还听说这被称为父窗口的句柄。什么是父/所有者窗口?正如您在下面看到的,我使用 NULL 作为句柄,但由于操作确实与窗口相关联,我可能需要一个句柄,但我不知道该句柄使用什么。

ShellExecute(NULL, "open" ,"Excel.exe", 
    "C:\\Documents and Settings\\Lab1\\My Documents\\Test.xls", 
    NULL, SW_SHOWNORMAL);
4

4 回答 4

2

通常为 0

hwnd :将接收可能的消息框的父窗口。该参数通常为 0。

它指的是顶级窗口:您正在打开的窗口没有任何父窗口,并且是正在执行的应用程序的主窗口。

当您在应用程序之间切换 (ALT-TAB) 时,您将按 z 顺序显示下一个顶级窗口(下一个父句柄等于 0 的应用程序)(例如)。

当然,您的应用程序的父级不能是桌面窗口本身

如果您创建一个父窗口为 GetDesktopWindow() 的子窗口,则您的窗口现在粘在桌面窗口上。如果您的窗口随后调用 MessageBox() 之类的东西,那么这是一个模态对话框,然后上面的规则就会启动,桌面会被禁用,机器会吐司。

对于路径,我建议在简单引号周围使用双引号:" ' ... ' "

"'C:\\Documents and Settings\\Lab1\\My Documents\\Test.xls'"

也可以使用双双引号(未经测试):" "" ... "" "

"""C:\\Documents and Settings\\Lab1\\My Documents\\Test.xls"""

,如this thread所示。


实际上,正如 Andy 和 Mesidin 在您另一个问题以及在ShellExecute Function 手册中所提到的,您可以打开文件,并在参数中传递其路径。

ShellExecute( NULL, "open", 
              "Test.xls", "C:\\Documents and Settings\\Lab1\\My Documents\\", 
              NULL, SW_SHOWNORMAL);

这意味着 Excel 是打开 .xls 扩展文件的默认应用程序。

于 2008-11-24T21:32:51.427 回答
2

当您看到它被描述为“父窗口句柄”时,这意味着它将成为该函数选择显示的任何 UI 的父窗口。在您调用时,您传递的句柄可能已经或可能不是其他窗口的父级ShellExecute,但这并不重要。

于 2008-11-24T22:59:08.040 回答
1

你为什么专门ShellExecuting Excel?如果他们有 OpenOffice.org,他们就坏了——你真的应该在电子表格文件上调用“打开”动词,你不需要在“Excel”名称中硬编码,这就是 ShellExecute 的用途。

于 2008-11-24T23:29:15.340 回答
0

有什么具体原因,您使用的是 ShellExecute 吗?

您可以使用 [System.Diagnostics.]Process.Start [文件名] 打开 xls 文件
抱歉,我没有查看标签并假设您使用的是 .net

于 2008-11-24T23:16:03.043 回答