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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пробовал. Не помогает.
...
Рейтинг: 0 / 0
29.04.2021, 15:18
    #40067299
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecuteEx hProcess PID - процесса Explorer.exe
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
29.04.2021, 15:32
    #40067306
nicegrin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecuteEx hProcess PID - процесса Explorer.exe
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
29.04.2021, 17:14
    #40067346
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecuteEx hProcess PID - процесса Explorer.exe
Тут капец глаза сломать можно. Где какой тип?
Код: plaintext
1.
unsigned long *che, attr;
...
Рейтинг: 0 / 0
29.04.2021, 17:26
    #40067349
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecuteEx hProcess PID - процесса Explorer.exe
Dima T
С выводом окон поверх других все непросто, МС ввел ограничения т.к. разработчики злоупотребляют этим делом. Ты даешь команду вывести поверх всех окон, а виндавс не всегда это делает, чаще просто моргает в таскбаре.

Я как-то давно разбирался с подобной проблемой, в итоге сделал наоборот - не новое окно наверх, а свое окно уводил за новое.
да AFAIK. Было такое дело))
...
Рейтинг: 0 / 0
29.04.2021, 20:22
    #40067388
nicegrin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ShellExecuteEx hProcess PID - процесса Explorer.exe
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
Форумы / C++ [игнор отключен] [закрыт для гостей] / ShellExecuteEx hProcess PID - процесса Explorer.exe / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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