Дескриптор для ShellExecute () - Родительское окно? - PullRequest
3 голосов
/ 25 ноября 2008

Я пытаюсь использовать 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 ]

2 голосов
/ 25 ноября 2008

Когда вы видите его, описанный как «дескриптор родительского окна», это означает, что это окно, которое будет родительским окном любого пользовательского интерфейса, который функция выберет для отображения. Дескриптор, который вы передаете, может или не может быть родительским для какого-то другого окна во время вызова ShellExecute, но это не важно.

2 голосов
/ 25 ноября 2008

Это обычно 0

hwnd: родительское окно, которое получит возможное окно сообщения. Этот параметр обычно равен 0.

Это относится к окну верхнего уровня: открываемое окно не имеет родителя и является основным окном для выполняемого приложения.

Когда вы переключаетесь между приложениями (ALT-TAB), вы отображаете следующее окно верхнего уровня (следующее приложение с родительским дескриптором, равным 0) в z-порядке (например).

Конечно, родителем вашего приложения не может быть само окно рабочего стола :

Если вы создаете дочернее окно, чьим родителем является GetDesktopWindow (), ваше окно теперь приклеивается к окну рабочего стола. Если ваше окно затем вызывает что-то вроде MessageBox (), то это модальное диалоговое окно, а затем вступают в силу вышеприведенные правила, и рабочий стол отключается, и компьютер загружается.

Для пути я бы посоветовал двойные кавычки, окружающие простые кавычки: " ' ... ' "

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

Может также работать (не проверено) с двойными двойными кавычками: " "" ... "" "

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

, как показано этой веткой .


На самом деле, как уже упоминалось в вашем другом вопросе от Andy и Mesidin , а также в ShellExecute Function manual , вы можете открыть файл и передайте его путь в параметре.

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

Это означает, что Excel является приложением по умолчанию для открытия файлов расширения .xls.

1 голос
/ 25 ноября 2008

Почему вы специально ShellExecuting Excel? Если у них есть OpenOffice.org, они сломаны - вам действительно следует вызывать глагол «Открыть» в файле электронной таблицы, вам не нужно жестко кодировать имя «Excel», для этого и нужен ShellExecute. *

0 голосов
/ 25 ноября 2008

Есть ли конкретная причина, по которой вы используете ShellExecute?

Вы можете открыть файл xls, используя [System.Diagnostics.] Process.Start [имя файла]
Я прошу прощения, я не смотрел на теги и предполагаю, что вы используете .net

...