Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 15.02.2016
Сообщений: 4
1

CreateProcess работает странно в D10

15.02.2016, 16:23. Показов 898. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Существует программа, в которой основная невидимая программа-диспетчер поочередно запускает другие программы.
В D3 и D7 все работало как часы уже лет 15. При переходе на D10 (проект тот же, без изменений) столкнулся с тем, что только первый запуск из программы-диспетчера работает нормально, остальные программы запускаются "сзади", не в режиме ForeGround (система - W10). Использование CreateProcess совершенно стандартное, без никаких дополнений. Подозреваю, что дело в параметре nCmdShow, который нужен для повторных запусков, но функция ShowWindow в программе не используется. Поиски показали что все работает нормально, если убрать Hide с формы диспетчера, но тогда она становится видна, чего не должно быть. Перепробовал все, что нашел. Максимум чего удалось добиться - мигает иконка на панели задач,но вытащить вперед не удается - только руками. Проблема еще в том, что запускаемые программы меняют окна, заголовки и жрут немалые вычислительные ресурсы (плохо слушаются).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2016, 16:23
Ответы с готовыми решениями:

CreateProcess не работает функция
Вот кусок кода который должен создавать файл f.bat типа "ipconfig > log.txt". Соответственно...

CreateProcess странно работает
Привет. Есть такая функция CreateProcess. Я хочу запустить файл, предположим, в D:\Program...

Не работает зацикливание gif [D10.1 Berlin]
Добрый день, делаю программную сборку gif анимации, сама картинка собирается и проигрывается всего...

CreateProcess не работает
Приветствую, уважаемые перекурил почти все топики на форуме, но свою проблему так и не смог решить...

6
3218 / 2361 / 540
Регистрация: 11.09.2009
Сообщений: 8,604
22.02.2016, 12:16 2
Цитата Сообщение от frolsa Посмотреть сообщение
(система - W10)
Да, в ней изменилась логика управления окнами. Видимо, это связано с наличием разных интерфейсов "Рабочего стола". Надо заново учить матчасть.
1
0 / 0 / 0
Регистрация: 15.02.2016
Сообщений: 4
22.02.2016, 21:57  [ТС] 3
Удалось починить вот такой вставкой после CreateProcess (основа взята из интернета):
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
function EnumWindowsProc(Wnd: HWND): Bool;  export; {$ifdef Win32} stdcall; {$endif}
var Pid:Pointer;
    Buffer: array[0..100] of Char;
    ThisThreadID,ForeID:HWNd;
  begin
  GetWindowThreadProcessId(Wnd,@Pid); GetWindowText(Wnd,Buffer,100); 
  if copy(Buffer,1,19)='Имя окна нужной программы' then
    begin
    ForeID := GetWindowThreadProcessID(GetForegroundWindow, nil);
    ThisThreadID := GetWindowThreadPRocessId(Wnd, nil);
    if AttachThreadInput(ThisThreadID, ForeID, True) then
      begin
      BringWindowToTop(Wnd);
      SetForegroundWindow(Wnd);
      sleep(50);
      AttachThreadInput(ThisThreadID, ForeID, False);
      Result:=false;
      exit;
      end;
    end;
  result:=true;
  end;
 
procedure ForceForeground;
  begin
  EnumWindows(@EnumWindowsProc,0);
  end;
Задержка нужна для уверенного срабатывания.
0
3218 / 2361 / 540
Регистрация: 11.09.2009
Сообщений: 8,604
22.02.2016, 22:08 4
Цитата Сообщение от frolsa Посмотреть сообщение
Задержка нужна для уверенного срабатывания.
По-моему, использование sleep() для ожидания выполнения системной функции совсем не гарантирует её выполнение.
Почему не Application.ProcessMessages?
0
0 / 0 / 0
Регистрация: 15.02.2016
Сообщений: 4
22.02.2016, 22:16  [ТС] 5
Я пробовал разные комбинации - винда очень ненадежно реагирует. Эта показалась мне самой надежной, хотя согласен, криво.
0
3218 / 2361 / 540
Регистрация: 11.09.2009
Сообщений: 8,604
22.02.2016, 22:54 6
Цитата Сообщение от frolsa Посмотреть сообщение
Я пробовал разные комбинации...
Я бы проверок добавил. Вот у вас даже EnumWindows без проверки вызывается, хотя он boolean.
Можно и нужное состояния окна с проверкой ждать, делать пару попыток, отрабатывать случай "не удалось...".
0
0 / 0 / 0
Регистрация: 15.02.2016
Сообщений: 4
24.02.2016, 09:43  [ТС] 7
Все это есть, я здесь упростил немного...Там у меня EnumWindows в 10-шаговом цикле с проверкой и на exit. Но выкладывать такое мне показалось несколько нахальным - типа, низкий уровень, крутые ребята так не пишут
0
24.02.2016, 09:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.02.2016, 09:43
Помогаю со студенческими работами здесь

Не работает CreateProcess
Ребята, пытаюсь так создать процесс, но функция возвращает False. Пытаюсь в студии 2010 собрать...

CreateProcess не работает
Здравствуйте. Делаю программу, которая запускает внешнюю прогу. Инструментарий - Microsoft Visual...

Странно работает / не работает кулер на видеокарте
Всем привет! Имею видеокарту geforce gtx 650 ti boost от производителя gainward. Пару месяцев назад...

if, else if работает странно.
Написал программу html> <head> <title>Roll Em!</title> </head> <body> <div...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru