【问题标题】:Handle for ShellExecute() - Parent Window?ShellExecute() 的句柄 - 父窗口?
【发布时间】:2008-11-24 21:24:39
【问题描述】:

我正在尝试使用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);

【问题讨论】:

  • 刚刚添加了报价建议。告诉我其中一种组合是否有效。
  • 你试过双双引号吗?它实际上有三个双引号:开头和结尾的“””。
  • 我用三个双引号试过了,还是说找不到文件。
  • 如果这条路径确实存在(如果你可以在上面创建一个'dir'),剩下的就是尝试你能想到的每一个引用组合;)
  • 是的!恭喜!你做到了!

标签: handle shellexecute


【解决方案1】:

usually 0

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

指顶层窗口:你打开的窗口没有父窗口,是正在执行的应用程序的主窗口。

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

当然,您的应用的父级can not be the Desktop Window itself

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

对于路径,我建议用双引号将单引号括起来:" ' ... ' "

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

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

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

,如this thread所示。


实际上,正如your other question by AndyMesidinShellExecute Function manual 中提到的,您可以打开文件,并在参数中传递其路径。

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

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

【讨论】:

  • 谢谢,这回答了我的问题。但是,当我编译上面显示的行时,它会打开 Excel,但它说找不到文件“Test.xls”。你知道为什么它不起作用吗?
  • dir "C:\Documents and Settings\Lab1\My Documents\Test.xls" 有效吗?
  • 如果是,它必须与路径中的所有空格相关。可能在双引号“''”中添加简单引号,或者相反('“...”')会有所帮助。当然没有空格:我添加它们是为了更好地查看引号
  • 我尝试了双双引号,结果出错。我也试过单双引号,结果和以前一样。
  • 哇,所以我尝试了: ShellExecute(NULL, "open" ,"Test.xls", "C:\\Documents and Settings\\Lab1\\My Documents\\", NULL, SW_SHOWNORMAL );它完全奏效了!感谢您的帮助!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 当我在电子表格文件上调用“打开”动词时,什么都没有发生——事实上 excel 甚至都没有打开。但也许这是因为路径中的空格,正如 VonC 所指出的那样,他链接的线程。
    【解决方案4】:

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

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

    【讨论】:

    • 我使用 ShellExecute 只是因为这是我唯一的想法。我正在使用 Borland Builder C++
    • 如果您查看问题和标签,这并不明显。这就是原因,我说 - 我道歉....
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多