ShellExecute()的句柄 - 父窗口?

3
我正在尝试使用ShellExecute打开Excel文件。我在MSDN论坛上阅读了有关该函数的信息,并发现第一个参数handle的以下信息:
"hwnd [in]用于显示用户界面(UI)或错误消息的所有者窗口的句柄。如果操作与窗口无关,则此值可以为NULL。"
我也听说过这被称为父/所有者窗口的句柄。什么是父/所有者窗口?如下所示,我正在使用NULL作为句柄,但由于操作确实与窗口相关,我可能需要一个句柄,但我不知道要使用什么句柄。
ShellExecute(NULL, "open" ,"Excel.exe", 
    "C:\\Documents and Settings\\Lab1\\My Documents\\Test.xls", 
    NULL, SW_SHOWNORMAL);

刚刚添加了引号建议。告诉我其中哪个组合有效。 - VonC
你尝试正确使用双引号了吗?实际上它有三个双引号:开头和结尾的" " "。 - VonC
我尝试使用三个双引号,但它仍然显示找不到文件。 - Shishiree
如果该路径存在(如果您可以在其上执行“dir”命令),那么剩下的就是尝试您能想到的每种引号组合了 ;) - VonC
是的!恭喜你!你做到了! - VonC
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"""

此帖所示。
实际上,正如您的另一个问题中由AndyMesidin提到的,并在ShellExecute函数手册中提到的,您可以打开文件并将其路径作为参数传递。
ShellExecute( NULL, "open", 
              "Test.xls", "C:\\Documents and Settings\\Lab1\\My Documents\\", 
              NULL, SW_SHOWNORMAL);

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

谢谢,你回答了我的问题。然而,当我编译上面的代码时,它打开了Excel,但是显示找不到文件“Test.xls”。你有任何想法为什么它不起作用吗? - Shishiree
“dir "C:\Documents and Settings\Lab1\My Documents\Test.xls"” 这个命令可以正常工作吗? - VonC
如果是这样,那么它必须与您路径中的所有空格有关。也许在双引号“”内添加单引号''或反之亦然(' "..." ')会有所帮助。当然不要加空格:我添加了它们以更好地看到引号。 - VonC
我尝试了双重引号,但结果出现错误。我还尝试了单双引号,但结果与之前相同。 - Shishiree
哇,所以我尝试了: ShellExecute(NULL, "open" ,"Test.xls", "C:\Documents and Settings\Lab1\My Documents\", NULL, SW_SHOWNORMAL);它完全成功了!感谢您的帮助! - Shishiree

2

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


1

你为什么特别要使用ShellExecute来执行Excel?如果他们有OpenOffice.org,那么他们是有问题的 - 你应该调用电子表格文件上的“打开”动作,而不需要硬编码“Excel”名称,这就是ShellExecute的作用。


当我在电子表格文件上调用“打开”动词时,什么也没有发生——实际上 Excel 甚至都没有打开。但也许这是因为路径中有空格,正如 VonC 在他链接的线程中指出的那样。 - Shishiree

0

您使用ShellExecute的特定原因是什么?

您可以使用[System.Diagnostics.]Process.Start [文件名]打开xls文件
抱歉,我没有注意标签并假设您正在使用.net


我使用ShellExecute只是因为那是我唯一想到的方法。我正在使用Borland Builder C++。 - Shishiree
如果你只看问题和标签,那是不明显的。 这就是我说道歉的原因。 - shahkalpesh

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