powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / ShellExecuteEx hProcess PID - процесса Explorer.exe
17 сообщений из 17, страница 1 из 1
ShellExecuteEx hProcess PID - процесса Explorer.exe
    #40067194
nicegrin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем ДВС.
Есть тривиальная задача - открыть папку в проводнике Windows и показать (выделить) в ней заданный файл (конечно же программно).
Так вот, по итогу было найдено решение: использовать ShellExecute, с параметрами "open" "explorer" "/select, путь к файлу".
И все вроде хорошо, за исключением того, что окно проводника открывается в фоне, и приветливо моргает с "таскбара".

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

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

Так вот и вопрос, как получить корректный PID для процесса, созданного в результате выполнения ShellExecuteEx c указанными параметрами?
...
Рейтинг: 0 / 0
ShellExecuteEx hProcess PID - процесса Explorer.exe
    #40067203
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicegrin,
А если идти не от процесса а найти хендл окна (да хоть по заголовку) и послать ему мессагу?
...
Рейтинг: 0 / 0
ShellExecuteEx hProcess PID - процесса Explorer.exe
    #40067204
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicegrinкак получить корректный PID для процесса, созданного в результате выполнения
ShellExecuteEx c указанными параметрами?

В данном случае - никак, поскольку этот процесс давно завершился, передав управление
предыдущему запущенному инстансу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ShellExecuteEx hProcess PID - процесса Explorer.exe
    #40067234
nicegrin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

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

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

Тогда остается нетривиальная задача вывести окно с выделенным файлом на первый план, как это делают прочие программы (браузеры, IDE и т.д.)
...
Рейтинг: 0 / 0
ShellExecuteEx hProcess PID - процесса Explorer.exe
    #40067237
nicegrin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp, возможно что-то похожее и придется делать.
...
Рейтинг: 0 / 0
ShellExecuteEx hProcess PID - процесса Explorer.exe
    #40067241
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Процесс explorer.exe запускается при входе в виндовс, а ShellExecute() как-то передает ему какую папку открыть. Скорее всего для этого запускается промежуточный процесс, который передает и завершается.
...
Рейтинг: 0 / 0
ShellExecuteEx hProcess PID - процесса Explorer.exe
    #40067246
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicegrinТ.е. она запускается и инициирует новый процесс explorer.exe своими силами чтобы
предоставить результат.

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

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

Разве не именно для этого служит параметр nShow?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ShellExecuteEx hProcess PID - процесса Explorer.exe
    #40067281
nicegrin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

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

В данном случае этот параметр не влияет на требуемый результат. И Ничего черного по английски нигде не написано, если говорить о положении окон запускаемых процессов относительно других окон. https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecutea
...
Рейтинг: 0 / 0
ShellExecuteEx hProcess PID - процесса Explorer.exe
    #40067285
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С выводом окон поверх других все непросто, МС ввел ограничения т.к. разработчики злоупотребляют этим делом. Ты даешь команду вывести поверх всех окон, а виндавс не всегда это делает, чаще просто моргает в таскбаре.

Я как-то давно разбирался с подобной проблемой, в итоге сделал наоборот - не новое окно наверх, а свое окно уводил за новое.
...
Рейтинг: 0 / 0
ShellExecuteEx hProcess PID - процесса Explorer.exe
    #40067287
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicegrinВ данном случае этот параметр не влияет на требуемый результат.

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

И пробовал ли использовать AllowSetForegroundWindow(ASFW_ANY)?
...
Рейтинг: 0 / 0
ShellExecuteEx hProcess PID - процесса Explorer.exe
    #40067289
nicegrin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,
Explore всегда отлично работает , НО, только с каталогами. с файлами данная операция - не прокатывает.
Файл можно или открыть, или отредактировать или напечатать в основном.
...
Рейтинг: 0 / 0
ShellExecuteEx hProcess PID - процесса Explorer.exe
    #40067297
nicegrin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

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

Пробовал. Не помогает.
...
Рейтинг: 0 / 0
ShellExecuteEx hProcess PID - процесса Explorer.exe
    #40067299
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MSDNThe 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
...
Рейтинг: 0 / 0
ShellExecuteEx hProcess PID - процесса Explorer.exe
    #40067306
nicegrin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

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

SHOpenFolderAndSelectItems рулит.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
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);
}
...
Рейтинг: 0 / 0
ShellExecuteEx hProcess PID - процесса Explorer.exe
    #40067346
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут капец глаза сломать можно. Где какой тип?
Код: plaintext
1.
unsigned long *che, attr;
...
Рейтинг: 0 / 0
ShellExecuteEx hProcess PID - процесса Explorer.exe
    #40067349
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
С выводом окон поверх других все непросто, МС ввел ограничения т.к. разработчики злоупотребляют этим делом. Ты даешь команду вывести поверх всех окон, а виндавс не всегда это делает, чаще просто моргает в таскбаре.

Я как-то давно разбирался с подобной проблемой, в итоге сделал наоборот - не новое окно наверх, а свое окно уводил за новое.
да AFAIK. Было такое дело))
...
Рейтинг: 0 / 0
ShellExecuteEx hProcess PID - процесса Explorer.exe
    #40067388
nicegrin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,
Прошу прощения, набирал вживую, не копипастил, поставил указатель где он не нужен:
Исправляюсь
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
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);
}
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / ShellExecuteEx hProcess PID - процесса Explorer.exe
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]