Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
257 / 149 / 70
Регистрация: 29.07.2018
Сообщений: 1,249
RAD 2009-XE2

Заменить Shell на свою программу и запустить explorer.exe из под программы

22.05.2023, 10:28. Показов 1657. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Стоит задача: Заменить Shell на свою программу и запустить explorer.exe из под программы. Программа простая,после запроса основного пароля пользователя запускается моя программа и запрашивает дополнительный пароль(эдакая двухфакторная авторизация для организации)
Код:
Кликните здесь для просмотра всего текста

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
unit MainFormUnit;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, ShellAPI,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, TlHelp32;
 
type
  TLogonForm = class(TForm)
    PwdEdit: TEdit;
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormResize(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  LogonForm: TLogonForm;
 
implementation
 
{$R *.dfm}
 
procedure TLogonForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if PwdEdit.Text = 'pwd123' then
  begin
    ShellExecute(Handle, 'open', 'explorer.exe', nil, nil, SW_SHOWNORMAL);
    CanClose := true;
    exit;
  end;
  CanClose := False;
end;
 
procedure TLogonForm.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = 13 then
    Close;
end;
 
procedure TLogonForm.FormResize(Sender: TObject);
var
  cw, ch: integer;
begin
  cw := Round(Width / 2) - (Round(PwdEdit.Width / 2));
  ch := Round(Height / 2);
  PwdEdit.Left := cw;
  PwdEdit.Top := ch;
end;
 
end.

В Компьютер\HKEY_LOCAL_MACHINE\SOFTWARE\Mi crosoft\Windows NT\CurrentVersion\Winlogon в свойство Shell
поставил свою программу.
Собственно вопрос,после перезагрузки моя программа запускается,все хорошо,но после ввода верного пароля запускается не рабочий стол,а обычный файловый проводник,такое бывает если explorer.exe уже запущен,но я пробовал и завершать этот процесс перед его запуском,все безуспешно. Знатоков прошу помочь решить эту проблему.
Заранее спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.05.2023, 10:28
Ответы с готовыми решениями:

Замена shell на свою программу. Проблема с запуском explorer.exe
Добрый день. Имеется ПК, который стоит на посту охраны и используется для видеонаблюдения. На этом ПК вместо оболочки (shell) запускалась...

Как запустить свою программу вместо Explorer.exe
Здравствуйте всем!!! Помогите решить одну задачку, вот тут нужно исправить, как указать свой проект который в C:\Progi\Project1.exe в...

Как запустить свою программу вместо Explorer.exe
Здравствуйте всем!!! Помогите решить одну задачку, вот тут нужно исправить, как указать свой проект который в C:\Progi\Project1.exe в ...

8
 Аватар для Worldmaster
323 / 190 / 45
Регистрация: 25.08.2011
Сообщений: 1,261
23.05.2023, 11:37
Пс, Наверное надо запускать вот так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
begin
  // Ваш код и логика программы
 
  // Запуск вашей программы
  ShellExecute(0, 'open', 'путь_к_вашей_программе.exe', nil, nil, SW_SHOWNORMAL);
 
  // Ожидание завершения вашей программы
  // ...
 
  // Завершение вашей программы
  ExitProcess(0);
end.
Может быть система определяет что программа которая записана в Shell запущена и автоматом запускает эксплорер в режиме проводника.
Надо чтобы вашей программы не было в списке работающих на момент запуска проводника.
0
257 / 149 / 70
Регистрация: 29.07.2018
Сообщений: 1,249
23.05.2023, 11:42  [ТС]
Worldmaster, Хмм,а это в принципе логичное поведение.Спасибо,сейчас попробую.
0
Модератор
4074 / 2315 / 798
Регистрация: 15.11.2015
Сообщений: 9,167
23.05.2023, 11:43
Попробуй запускать проводник через CreateProcess.
0
257 / 149 / 70
Регистрация: 29.07.2018
Сообщений: 1,249
23.05.2023, 12:33  [ТС]
AzAtom, Тоже пробовал.

Добавлено через 42 минуты
Worldmaster,
Может я что-то не так понял.Я написал вторую программу,которая запускает explorer.exe
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
program StartExplorer;
 
{$APPTYPE CONSOLE}
{$R *.res}
 
uses
  ShellAPI, WinAPI.Windows;
 
begin
  sleep(1000);
  ShellExecute(GetForegroundWindow, 'open', 'explorer.exe', nil, nil,
    SW_SHOWNORMAL);
end.
И переделал основную:
Кликните здесь для просмотра всего текста

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
unit MainFormUnit;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, ShellAPI,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, TlHelp32;
 
type
  TLogonForm = class(TForm)
    PwdEdit: TEdit;
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormResize(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  LogonForm: TLogonForm;
 
implementation
 
{$R *.dfm}
 
procedure TLogonForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if PwdEdit.Text = 'pwd123' then
  begin
    ShellExecute(Handle, 'open',
      'StartExplorer.exe',
      nil, nil, SW_HIDE);
    CanClose := true;
    exit;
  end;
 
  CanClose := False;
end;
 
procedure TLogonForm.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = 13 then
    Close;
end;
 
procedure TLogonForm.FormResize(Sender: TObject);
var
  cw, ch: integer;
begin
  cw := Round(Width / 2) - (Round(PwdEdit.Width / 2));
  ch := Round(Height / 2);
  PwdEdit.Left := cw;
  PwdEdit.Top := ch;
end;
 
end.

Но все равно запускается файловый проводник.
0
 Аватар для Worldmaster
323 / 190 / 45
Регистрация: 25.08.2011
Сообщений: 1,261
23.05.2023, 12:59
Пс, а хэндл зачем передаете и чему он равен?

Delphi
1
2
3
ShellExecute(Handle, 'open',
      'StartExplorer.exe',
      nil, nil, SW_HIDE);
Попробуйте в обычном режиме протестировать. Сделать кнопку на форме, запустить программу, снять эксплорер , нажать кнопку и запустить эксплорер с задержкой и закрыв ту программу путь к которой в Shell стоит.
0
257 / 149 / 70
Регистрация: 29.07.2018
Сообщений: 1,249
23.05.2023, 13:22  [ТС]
Цитата Сообщение от Worldmaster Посмотреть сообщение
а хэндл зачем передаете и чему он равен?
Хэндл окна моего основного приложения,но я и с 0 пробовал

Добавлено через 2 минуты
Цитата Сообщение от Worldmaster Посмотреть сообщение
Попробуйте в обычном режиме протестировать. Сделать кнопку на форме, запустить программу, снять эксплорер , нажать кнопку и запустить эксплорер с задержкой и закрыв ту программу путь к которой в Shell стоит.
Так работает

Добавлено через 1 минуту
Хотя нет.Работает если в Shell указана explorer.exe.
А если указана моя программа,то не работает.
0
 Аватар для Worldmaster
323 / 190 / 45
Регистрация: 25.08.2011
Сообщений: 1,261
23.05.2023, 14:05
Цитата Сообщение от Пс Посмотреть сообщение
Хотя нет.Работает если в Shell указана explorer.exe.
А может него есть какие нибудь параметры??
0
257 / 149 / 70
Регистрация: 29.07.2018
Сообщений: 1,249
23.05.2023, 14:23  [ТС]
Worldmaster, Параметры командной строки?Нет,я выводил список всех переданных моей программе параметров,их вообще нет.

Добавлено через 12 минут
Worldmaster, Возможно,после запуска моей программы в Shell,надо менять его обратно на explorer.exe,но так не получится,потому что у пользователей нет прав на замену ключей в реестре.И к тому же,после запуска explorer'a надо будет снова в Shell ставить мою программу,что бы после перезагрузки снова она запустилась.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.05.2023, 14:23
Помогаю со студенческими работами здесь

Замена Shell (explorer) на свою программу
Здравствуйте. В ранних версиях Windows это можно было сделать в ключе SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon. Сейчас что-то...

Ручной запуск Explorer.exe прогой, запущенной по [HKLM]...WinLogon/Shell [ Win7 ]
Прописал программу в параметре Shell реестра. procedure TFormRunExplorer.btKillExplorerClick(Sender: TObject); begin ...

Как запустить программу на Java (обернутую в exe) на разных компьютерах под x86 и x64?
Я учу java и пишу свои первые программы на компьютере под windows (x64). Что мне нужно сделать, чтобы запустить свою программу на других...

Запустить explorer.exe с правами админа
Есть комп в сети и грубо говоря аккаунт пользователя и аккаунт админа. При входе под пользователем мапятся три сетевых диска. Пользователь...

Ошибка при запуске написанной программы "Не удается запустить программу cmd.exe"
Столкнулся с такой проблемой: при запуске проекта без отладки выдаёт ошибку При запуске с отладкой всё нормально. Проект написан на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Квантовые алгоритмы и обработка строк в Q#
EggHead 07.06.2025
Квантовые вычисления перевернули наше представление о том, как работать с данными, а Q# стал одним из ключевых языков для разработки квантовых алгоритмов. В традиционых системах мы оперируем битами —. . .
NUnit и C#
UnmanagedCoder 07.06.2025
В . NET существует несколько фреймворков для тестирования: MSTest (встроенный в Visual Studio), xUnit. net (более новый фреймворк) и, собственно, NUnit. Каждый имеет свои преимущества, но NUnit. . .
с++ Что нового?
russiannick 06.06.2025
Продолжаю обзор dev-cpp5. 11. Посмотрев на проекты, предоставленные нам для обучения, становится видно, что они разные по содержащимся файлам где: . dev обязательно присутствует . cpp/ . c один из них. . .
WebAssembly в Kubernetes
Mr. Docker 06.06.2025
WebAssembly изначально разрабатывался как бинарный формат инструкций для виртуальной машины, обеспечивающий высокую производительность в браузерах. Но потенциал технологии оказался гораздо шире - она. . .
Как создать первый микросервис на C# с ASP.NET Core, step by step
stackOverflow 06.06.2025
Если говорить простыми словами, микросервисная архитектура — это подход к разработке, при котором приложение строится как набор небольших, слабо связанных сервисов, каждый из которых отвечает за. . .
Рисование коллайдеров Box2D v2 на Three.js с помощью порта @box2d/core
8Observer8 06.06.2025
Используется порт Box2D v2 под названием @box2d/ core - пакет NPM. Загрузил документацию Box2D v2 на Netlify: https:/ / box2d-v2-docs. netlify. app/ Документацию Box2D v2 можно скачать с официального. . .
Как создать стек в Python
AI_Generated 05.06.2025
Как архитектор с более чем десятилетним опытом работы с Python, я неоднократно убеждался, что знание низкоуровневых механизмов работы стеков дает конкурентное преимущество при решении сложных задач. . . .
Server-Sent Events (SSE) в Node.js
run.dev 05.06.2025
Потоковая передача данных с сервера прямо в браузер стала повседневной потребностью - от биржевых графиков и спортивных трансляций до чатов и умных дашбордов. Много лет разработчики полагались на. . .
Создаем RESTful API на Golang с Fiber
golander 04.06.2025
Я перепробовал десятки фреймворков для создания RESTful API за последние годы, и когда впервые столкнулся с Fiber, понял, что это совсем другой уровень. Нет, я не собираюсь рассказывать сказки о. . .
Как работать с куки в ASP.NET Core
UnmanagedCoder 04.06.2025
Когда я впервые начал работать с куки в ASP. NET Core, меня поразило, насколько отличается работа с ними от классического ASP. NET. В Core все стало более декомпозированным - больше нет удобного. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »