Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
 ShellExecuteEx hProcess PID - процесса Explorer.exe  [new]
nicegrin
Member

Откуда:
Сообщений: 8
Всем ДВС.
Есть тривиальная задача - открыть папку в проводнике Windows и показать (выделить) в ней заданный файл (конечно же программно).
Так вот, по итогу было найдено решение: использовать ShellExecute, с параметрами "open" "explorer" "/select, путь к файлу".
И все вроде хорошо, за исключением того, что окно проводника открывается в фоне, и приветливо моргает с "таскбара".

Погуглив было решено перейти на использование ShelExecuteEx, для того, чтобы получать ссылку на объект запущенного процесса, и затем, получая его идентифкатор через GetProcessId искать соответствующее ему окно через EnumWindows и делать его Поверх остальных.

Однако, получаемый по hProcess идентификатор, по итогу вообще не соотносится ни с одним из процессов (согласно менеджеру процессов). Открыть его и уничтожить (OpenProcess -> TerminateProcess), также ни к чему не приводит.

Так вот и вопрос, как получить корректный PID для процесса, созданного в результате выполнения ShellExecuteEx c указанными параметрами?

Сообщение было отредактировано: 29 апр 21, 12:49
29 апр 21, 12:57    [22316284]     Ответить | Цитировать Сообщить модератору
 Re: ShellExecuteEx hProcess PID - процесса Explorer.exe  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
nicegrin,
А если идти не от процесса а найти хендл окна (да хоть по заголовку) и послать ему мессагу?
29 апр 21, 13:03    [22316295]     Ответить | Цитировать Сообщить модератору
 Re: ShellExecuteEx hProcess PID - процесса Explorer.exe  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394

nicegrin
как получить корректный PID для процесса, созданного в результате выполнения
ShellExecuteEx c указанными параметрами?

В данном случае - никак, поскольку этот процесс давно завершился, передав управление
предыдущему запущенному инстансу.

Posted via ActualForum NNTP Server 1.5

29 апр 21, 13:04    [22316296]     Ответить | Цитировать Сообщить модератору
 Re: ShellExecuteEx hProcess PID - процесса Explorer.exe  [new]
nicegrin
Member

Откуда:
Сообщений: 8
Dimitry Sibiryakov

В данном случае - никак, поскольку этот процесс давно завершился, передав управление
предыдущему запущенному инстансу.

Под выражением "этот процесс" вы имеете ввиду процесс выполнения команды программой explorer.exe? Т.е. она запускается и инициирует новый процесс explorer.exe своими силами чтобы предоставить результат. И Этот результат уже не имеет ничего общего с результатом ShellExecute. Ну тогда все объяснимо.

Тогда остается нетривиальная задача вывести окно с выделенным файлом на первый план, как это делают прочие программы (браузеры, IDE и т.д.)

Сообщение было отредактировано: 29 апр 21, 13:40
29 апр 21, 13:48    [22316338]     Ответить | Цитировать Сообщить модератору
 Re: ShellExecuteEx hProcess PID - процесса Explorer.exe  [new]
nicegrin
Member

Откуда:
Сообщений: 8
PetroNotC Sharp, возможно что-то похожее и придется делать.

Сообщение было отредактировано: 29 апр 21, 13:41
29 апр 21, 13:49    [22316341]     Ответить | Цитировать Сообщить модератору
 Re: ShellExecuteEx hProcess PID - процесса Explorer.exe  [new]
Dima T
Member

Откуда:
Сообщений: 15795
Процесс explorer.exe запускается при входе в виндовс, а ShellExecute() как-то передает ему какую папку открыть. Скорее всего для этого запускается промежуточный процесс, который передает и завершается.
29 апр 21, 13:53    [22316347]     Ответить | Цитировать Сообщить модератору
 Re: ShellExecuteEx hProcess PID - процесса Explorer.exe  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394

nicegrin
Т.е. она запускается и инициирует новый процесс explorer.exe своими силами чтобы
предоставить результат.

Ну блин, чёрным же по-англицки расписан именно этот случай в доке по ShellExecute...

nicegrin
Тогда остается нетривиальная задача вывести окно с выделенным файлом на первый план

Разве не именно для этого служит параметр nShow?..

Posted via ActualForum NNTP Server 1.5

29 апр 21, 14:03    [22316353]     Ответить | Цитировать Сообщить модератору
 Re: ShellExecuteEx hProcess PID - процесса Explorer.exe  [new]
nicegrin
Member

Откуда:
Сообщений: 8
Dimitry Sibiryakov

Разве не именно для этого служит параметр nShow?..

В данном случае этот параметр не влияет на требуемый результат. И Ничего черного по английски нигде не написано, если говорить о положении окон запускаемых процессов относительно других окон. https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecutea

Сообщение было отредактировано: 29 апр 21, 14:43
29 апр 21, 14:51    [22316401]     Ответить | Цитировать Сообщить модератору
 Re: ShellExecuteEx hProcess PID - процесса Explorer.exe  [new]
Dima T
Member

Откуда:
Сообщений: 15795
С выводом окон поверх других все непросто, МС ввел ограничения т.к. разработчики злоупотребляют этим делом. Ты даешь команду вывести поверх всех окон, а виндавс не всегда это делает, чаще просто моргает в таскбаре.

Я как-то давно разбирался с подобной проблемой, в итоге сделал наоборот - не новое окно наверх, а свое окно уводил за новое.
29 апр 21, 15:05    [22316407]     Ответить | Цитировать Сообщить модератору
 Re: ShellExecuteEx hProcess PID - процесса Explorer.exe  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394
nicegrin
В данном случае этот параметр не влияет на требуемый результат.

Это потому что ты используешь "open" на Проводник. Пробовал использовать "explore" на
нужный тебе файл?

И пробовал ли использовать AllowSetForegroundWindow(ASFW_ANY)?

Сообщение было отредактировано: 29 апр 21, 15:03
29 апр 21, 15:08    [22316410]     Ответить | Цитировать Сообщить модератору
 Re: ShellExecuteEx hProcess PID - процесса Explorer.exe  [new]
nicegrin
Member

Откуда:
Сообщений: 8
Dimitry Sibiryakov,
Explore всегда отлично работает , НО, только с каталогами. с файлами данная операция - не прокатывает.
Файл можно или открыть, или отредактировать или напечатать в основном.
29 апр 21, 15:12    [22316412]     Ответить | Цитировать Сообщить модератору
 Re: ShellExecuteEx hProcess PID - процесса Explorer.exe  [new]
nicegrin
Member

Откуда:
Сообщений: 8
Dimitry Sibiryakov

И пробовал ли использовать AllowSetForegroundWindow(ASFW_ANY)?

Пробовал. Не помогает.
29 апр 21, 15:17    [22316420]     Ответить | Цитировать Сообщить модератору
 Re: ShellExecuteEx hProcess PID - процесса Explorer.exe  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394

MSDN
The system restricts which processes can set the foreground window. A process
can set the foreground window only if one of the following conditions is true:

The process is the foreground process.
The process was started by the foreground process.
The process received the last input event.
There is no foreground process.
The foreground process is being debugged.
The foreground is not locked (see LockSetForegroundWindow).
The foreground lock time-out has expired (see SPI_GETFOREGROUNDLOCKTIMEOUT in
SystemParametersInfo).
No menus are active.

В данном случае если ты не соотвествуешь выделенному - ничто не поможет, окно будет только
моргать в таскбаре. Но я бы таки поэкспериментировал с AllowSetForegroundWindow().

Posted via ActualForum NNTP Server 1.5

29 апр 21, 15:18    [22316422]     Ответить | Цитировать Сообщить модератору
 Re: ShellExecuteEx hProcess PID - процесса Explorer.exe  [new]
nicegrin
Member

Откуда:
Сообщений: 8
Dimitry Sibiryakov,

Проблема решена. ShellExecute и К отдыхают
http://decoding.dax.ru/faq/vcl/files/files004.html

SHOpenFolderAndSelectItems рулит.

procedure OpenFolderAndSelectItem( Path: WideString );
var
  desk: IShellFolder;
  iidl: PItemIDList;
  attrs, che: Cardinal;
begin
   SHGetDesktopFolder( desk );
   desk.ParseDisplayName( 0, nil, PWideChar( Path ), che, iidl, attrs );
   SHOpenFolderAndSelectItems( iidl, 0, nil, 0 );
   // Если в функцию SHOpenFolderAndSelectItems в качестве последнего
   // параметра подставить OFASI_EDIT, то выбранный пункт в проводнике
   // перейдет в режим редактирования.
end;


Ну и коли ветка по С++ (В моем случае RAD Studio, Builder)
void ShowFileInExplorer(String p_fpath)
{
    IShellFolder *desk;
    PItemIDList iidl;
    unsigned long *che, attr;
    SHGetDesktopFolder(&desk);
    desk->ParseDisplayName(0, NULL, p_fpath.c_str(), &che, &iidl, &attr);
    SHOpenFolderAndSelectItems(iidl, 0, NULL, 0);
}


Сообщение было отредактировано: 29 апр 21, 15:31
29 апр 21, 15:32    [22316430]     Ответить | Цитировать Сообщить модератору
 Re: ShellExecuteEx hProcess PID - процесса Explorer.exe  [new]
mayton
Member

Откуда: loopback
Сообщений: 51389
Тут капец глаза сломать можно. Где какой тип?
unsigned long *che, attr;
29 апр 21, 17:14    [22316479]     Ответить | Цитировать Сообщить модератору
 Re: ShellExecuteEx hProcess PID - процесса Explorer.exe  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Dima T
С выводом окон поверх других все непросто, МС ввел ограничения т.к. разработчики злоупотребляют этим делом. Ты даешь команду вывести поверх всех окон, а виндавс не всегда это делает, чаще просто моргает в таскбаре.

Я как-то давно разбирался с подобной проблемой, в итоге сделал наоборот - не новое окно наверх, а свое окно уводил за новое.
да AFAIK. Было такое дело))
29 апр 21, 17:26    [22316483]     Ответить | Цитировать Сообщить модератору
 Re: ShellExecuteEx hProcess PID - процесса Explorer.exe  [new]
nicegrin
Member

Откуда:
Сообщений: 8
mayton,
Прошу прощения, набирал вживую, не копипастил, поставил указатель где он не нужен:
Исправляюсь
void ShowFileInExplorer(String p_fpath)
{
	IShellFolder *desk;
	PItemIDList iidl;
	unsigned long che, attr;
	SHGetDesktopFolder(&desk);
	desk->ParseDisplayName(0, NULL, p_fpath.c_str(), &che, &iidl, &attr);
	SHOpenFolderAndSelectItems(iidl, 0, NULL, 0);
}
29 апр 21, 20:22    [22316553]     Ответить | Цитировать Сообщить модератору
Все форумы / C++ Ответить