С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
kattikat
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 20
1

Запустить процесс

17.12.2012, 20:15. Просмотров 1659. Ответов 10
Метки нет (Все метки)

Запустить некоторый процесс(процесс может изменятся(в програмном коде), т.е. нельзя надеятся на FindWindow(нельзя использовать)) и вывести на экран Все окна принадлежащие данному процессу.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2012, 20:15
Ответы с готовыми решениями:

Программно запустить процесс explorer
Как программно запустить процесс explorer? Я пробовал, но он мне папку...

Неубиваемый процесс
Ребята помогите пожалуйста как сделать Неубиваемый процесс (системный) можете...

Убить процесс
Помогите с написанием проги, для "убийства" процесса:) Подскажите, плз,...

Заморозить процесс
Всем добрый день перечитал много чего в сети но так и не нашел то что надо ...

Неубиваемый процесс
Привет:) "Работаю" над созданием клиент-серверного приложения. Установила...

10
cotseec
Пишу на Delphi...иногда
1408 / 1267 / 285
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
Завершенные тесты: 3
18.12.2012, 00:04 2
Цитата Сообщение от kattikat Посмотреть сообщение
Запустить некоторый процесс(процесс может изменятся(в програмном коде), т.е. нельзя надеятся на FindWindow(нельзя использовать))
CreateProcess под "процесс может изменяться" понимается путь к тому, что необходимо запустить (программа)?
Цитата Сообщение от kattikat Посмотреть сообщение
и вывести на экран Все окна принадлежащие данному процессу.
ответит на вопрос Гугель
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26581 / 17828 / 7051
Регистрация: 22.10.2011
Сообщений: 31,372
Записей в блоге: 6
18.12.2012, 00:54 3
cotseec, тебя Правило 3.3 не особо касается? Не первый раз вижу в твоих ответах ссылку на Гугль...
0
kattikat
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 20
18.12.2012, 10:09  [ТС] 4
В пограмме пишется сначала один некоторый процесс, и при желании его можно изменить на другой и программа должна корректно работать
0
kattikat
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 20
19.12.2012, 00:25  [ТС] 5
Помогите исправить код

Delphi
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
program Project1;
 
 
{$R *.res}
 
uses
  System.SysUtils,
  Windows,
  messages;
 
var
  si: STARTUPINFOA;
  pi: PROCESS_INFORMATION;
  h: HWND;
  WC: TWndClassEx;
  Wnd, listbox: HWND;
  Msg: TMsg;
  i: Integer;
const
  WndClass = 'TWindow';
  WndCaption = 'Just Program';
 
function ChildList(ChildWnd: HWND): Bool; stdcall;
var
  ClassName, Text: string;
begin
  classname := 'ssss';
 // GetClassName (ChildWnd, pchar(ClassName), SizeOf(ClassName));
  SendMessage(listbox,LB_ADDSTRING,0,wparam(pchar('ssss')));
  result := true;
end;
 
function WindowProc(Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM):
  LRESULT; stdcall;
begin
  
  // Обработка сообщений
  case Msg of
    // Сообщение при закрытии формы
        
 
    WM_DESTROY:
      begin
        // Запрос на закрытие
        PostQuitMessage(0);
        // Отрицательный результат
        Result := 0;
        // Завершаем процедуру
        Exit
      end;
  else
    // Положительний результат
    Result := DefWindowProc(Wnd, Msg, wParam, lParam)
  end;
end;
 
 
 
begin
 
  // Производим действия над TWndClassEx
  with WC do
  begin
    cbSize := SizeOf(WC);
    // Перериовывание при изменении размера формы
    style := CS_HREDRAW or CS_VREDRAW;
    // Присваиваем адресс процедуры
    lpfnWndProc := @WindowProc;
    cbClsExtra := 0;
    cbWndExtra := 0;
    hInstance := hInstance;
    // Иконка
    hIcon := LoadIcon(0, IDI_APPLICATION);
    // Курсор
    hCursor := LoadCursor(0, IDC_ARROW);
    // Фон формы
    hbrBackground := COLOR_WINDOW;
    // Указатель на главное меню
    lpszMenuName := nil;
    // Имя класса
    lpszClassName := WndClass;
  end;
 
  // Регистрируем класс
  RegisterClassEx(WC);
  // Создаем форму с заданными параметрами
  Wnd := CreateWindowEx(0, WndClass, WndCaption, WS_OVERLAPPEDWINDOW, 250, 60,
    300, 200, 0, 0, hInstance, nil);
  // Отображаем форму
  ShowWindow(Wnd, SW_SHOWNORMAL);
 
  listbox := CreateWindowEx(WS_EX_CLIENTEDGE, 'ListBox', '', LBS_STANDARD or WS_CHILD or WS_VISIBLE, 0, 0, 121, 97, Wnd, 0, HInstance, nil);
 
  CreateProcessA(nil,
                'C:\Windows\system32\calc.exe',
                nil,
                nil,
                FALSE,
                0,
                nil,
                nil,
                si,
                pi);
  h := pi.hProcess;
 
  EnumChildWindows(h, @ChildList, i);
 
  while GetMessage(Msg, 0, 0, 0) do
  begin
    // Транслирование сообщений
    TranslateMessage(Msg);
    // Посылаем сообщения оконной процедуре
    DispatchMessage(Msg);
  end;
 
 
  // Завершение приложения
  Halt(Msg.wParam);
 
 
  
 
end.
Добавлено через 2 минуты
Прграмма к:
Запустить некоторый процесс(процесс может изменятся(в програмном коде), т.е. нельзя надеятся на FindWindow(нельзя использовать)) и вывести на экран Все окна принадлежащие данному процессу.
0
angstrom
2471 / 1847 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
19.12.2012, 00:53 6
Запускается, что дальше?
Delphi
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
program Test;
 
uses
  Windows, Messages, SysUtils;
 
var
  Wnd,
  listbox,
  h : HWND;
  WC    : TWndClassEx;
  Msg   : TMsg;
  si    : STARTUPINFO;
  pi    : PROCESS_INFORMATION;
 
const
  WndClass   = 'TWindow';
  WndCaption = 'Just Program';
 
function ChildList(ChildWnd : HWND) : Bool; stdcall;
var
  ClassName, Text : String;
begin
  classname := 'ssss';
// GetClassName (ChildWnd, pchar(ClassName), SizeOf(ClassName));
  SendMessage(listbox, LB_ADDSTRING, 0, wparam(pchar('ssss')));
  Result := True;
end;
 
function WindowProc(Wnd : HWND; Msg, wParam, lParam : Integer) : Integer ; stdcall;
begin
  case Msg of
    WM_DESTROY:
    begin
      PostQuitMessage(0);
      Result := 0;
      Exit;
    end;
  else
    Result := DefWindowProc(Wnd, Msg, wParam, lParam)
  end;
end;
 
begin
  FillChar(WC, SizeOf(TWndClassEx), 0);
  WC.cbSize        := SizeOf(WC);
  WC.style         := CS_HREDRAW or CS_VREDRAW;
  WC.lpfnWndProc   := @WindowProc;
  WC.hInstance     := hInstance;
  WC.hIcon         := LoadIcon(0, IDI_APPLICATION);
  WC.hCursor       := LoadCursor(0, IDC_ARROW);
  WC.hbrBackground := COLOR_WINDOW;
  WC.lpszMenuName  := NIL;
  WC.lpszClassName := WndClass;
 
  RegisterClassEx(WC);
 
  Wnd := CreateWindowEx(0, WndClass, WndCaption, WS_OVERLAPPEDWINDOW,
                        250, 60, 300, 200, 0, 0, hInstance, NIL);
  ShowWindow(Wnd, SW_SHOWNORMAL);
 
  listbox := CreateWindowEx(WS_EX_CLIENTEDGE, 'ListBox', '', LBS_STANDARD or WS_CHILD or WS_VISIBLE,
                            0, 0, 290, 160, Wnd, 0, hInstance, NIL);
 
  FillChar(SI, SizeOf(STARTUPINFO), 0);
  SI.cb          := SizeOf(TStartUpInfo);
  SI.dwFlags     := STARTF_USESHOWWINDOW;
  SI.wShowWindow := SW_HIDE;
 
  CreateProcessA(NIL, 'e:\Windows\system32\calc.exe', NIL, NIL, False, NORMAL_PRIORITY_CLASS, NIL, NIL, si, pi);
  h := pi.hProcess;
 
  EnumChildWindows(h, @ChildList, 0);
 
  while GetMessage(Msg, 0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
 
  Halt(Msg.wParam);
end.
1
kattikat
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 20
19.12.2012, 09:17  [ТС] 7
В том то и дело,что только для калькулятора работает, запускает. А если прописать адрес другого приложения то ничего
0
angstrom
2471 / 1847 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
19.12.2012, 12:14 8
Немного меняем и всё работает:
Delphi
1
2
3
4
5
...
  SI.wShowWindow := SW_SHOWNORMAL;
 
  CreateProcessA(NIL, 'e:\Windows\notepad.exe', NIL, NIL, False, NORMAL_PRIORITY_CLASS, NIL, NIL, si, pi);
...
P.S. стоял флаг прятать окна, только калькулятор на это не реагировал, а остальные приложения запускались скрытыми.
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26581 / 17828 / 7051
Регистрация: 22.10.2011
Сообщений: 31,372
Записей в блоге: 6
19.12.2012, 12:21 9
angstrom, что именно происходит в тот момент, когда ты pi.hProcess (то есть, HANDLE, хендл процесса, запущенного через CreateProcess), передаешь в EnumChildWindows, которая ждёт HWND первым параметром:
A handle to the parent window whose child windows are to be enumerated.
? То, что Дельфи позволяет передать одно вместо другого - еще не повод так делать... Этот код не будет делать того, чего от него ожидают. Может, он когда-нибудь и покажет результат, но это - стечение обстоятельств.
0
angstrom
2471 / 1847 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
19.12.2012, 12:47 10
Я ничего не пытаюсь делать, то что там неверный код и так понятно, поэтому я и задал вопрос ТС - Что дальше.
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26581 / 17828 / 7051
Регистрация: 22.10.2011
Сообщений: 31,372
Записей в блоге: 6
19.12.2012, 14:22 11
Скажем, так:
Delphi
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
program Test;
 
uses
  Windows, Messages, SysUtils;
 
const
  WndClass   = 'TWindow';
  WndCaption = 'Just Program';
 
var
   listbox : HWND;
 
function ChildList(ChildWnd : HWND; Lp : LPARAM) : BOOL; stdcall;
var
   s : array[0 .. MAX_PATH] of Char;
begin
   // Здесь можно получать любую информацию, можно класс, можно текст...
   GetClassName(ChildWnd, s, MAX_PATH);
   SendMessage(listbox, LB_ADDSTRING, 0, lparam(@s));
   Result := True;
end;
 
 
function ProcessList(Wnd : HWND; Lp : LPARAM) : BOOL; stdcall;
begin
   if IsWindowVisible(Wnd) then
   begin
      EnumChildWindows(Wnd, @ChildList, Lp)
   end;
   Result := True;
end;
 
function WindowProc(Wnd : HWND; Msg, wParam, lParam : Integer) : Integer ; stdcall;
begin
  case Msg of
    WM_DESTROY:
    begin
      PostQuitMessage(0);
      Result := 0;
      Exit;
    end;
  else
    Result := DefWindowProc(Wnd, Msg, wParam, lParam)
  end;
end;
 
var
  ProgPath : string;
 
  Wnd   : HWND;
  WC    : TWndClassEx;
  Msg   : TMsg;
  si    : STARTUPINFO;
  pi    : PROCESS_INFORMATION;
 
begin
  ProgPath := 'C:\WINDOWS\System32\calc.exe';
 
  FillChar(WC, SizeOf(TWndClassEx), 0);
  WC.cbSize        := SizeOf(WC);
  WC.style         := CS_HREDRAW or CS_VREDRAW;
  WC.lpfnWndProc   := @WindowProc;
  WC.hInstance     := hInstance;
  WC.hIcon         := LoadIcon(0, IDI_APPLICATION);
  WC.hCursor       := LoadCursor(0, IDC_ARROW);
  WC.hbrBackground := COLOR_WINDOW;
  WC.lpszMenuName  := NIL;
  WC.lpszClassName := WndClass;
 
  RegisterClassEx(WC);
 
  Wnd := CreateWindowEx(0, WndClass, WndCaption, WS_OVERLAPPEDWINDOW,
                        250, 60, 300, 200, 0, 0, hInstance, NIL);
  ShowWindow(Wnd, SW_SHOWNORMAL);
 
  listbox := CreateWindowEx(WS_EX_CLIENTEDGE, 'ListBox', '', LBS_STANDARD or WS_CHILD or WS_VISIBLE,
                            0, 0, 290, 160, Wnd, 0, hInstance, NIL);
  SendMessage(listbox, WM_SETFONT, WPARAM(GetStockObject(DEFAULT_GUI_FONT)), 1);
 
  FillChar(SI, SizeOf(STARTUPINFO), 0);
  SI.cb          := SizeOf(TStartUpInfo);
  SI.dwFlags     := STARTF_USESHOWWINDOW;
  SI.wShowWindow := SW_SHOWNORMAL;
 
  // Запускаем процесс
  CreateProcess(NIL, PChar(ProgPath), NIL, NIL, False, NORMAL_PRIORITY_CLASS, NIL, NIL, si, pi);
  // Ждем, пока создание окон будет завершено
  WaitForInputIdle(pi.hProcess, INFINITE);
 
  // И перечисляем окна, принадлежащие потоку запущенного приложения,
  // сколько бы их не было
  EnumThreadWindows(pi.dwThreadId, @ProcessList, LPARAM(0));
 
  while GetMessage(Msg, 0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
 
  Halt(Msg.wParam);
end.
0
19.12.2012, 14:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2012, 14:22

FindWindow и Фоновой процесс
Надо найти одну приложения с помощью FindWindow. Но как показывает Диспетчер...

Смоделировать физический процесс
Такая задача по компьютерному моделированию: может кто знаком с физическим...

Процесс на одно ядро
добрый день. свой вопрос я задавал на другой ветке немного в другой...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru