Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2016, 17:43   #1
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию Не работает SuspendThread для главного потока

Доброго времени суток. Хочу остановить главный поток выполнения программы, если делать это через отладчик, то всё работает, форма не реагирует на клики и прочее, подопотный - taskmgr.exe

Что сделано?
1) Получение handle по заголовку
2) Получение processId через handle
3) Через снэпшот получение главного потока
4) Остановка главного потока использованием SuspendThread

Код:
const
  THREAD_ALL_ACCESS = 2032639;
  CONTEXT_ALL = 524351;
var
  ThreadEntry: TThreadEntry32;
  SnapHandle, ProcessID, ThreadsID: DWord;
  Bytes:NativeUInt;
  ProcessHandle: THandle;
  ThreadContext: TContext;
  Find: Boolean;
  Buffer: PChar;
begin

  ProcessHandle := FindWindow(nil, 'Диспетчер задач Windows');
  if ProcessHandle = 0 then
    exit;
  GetWindowThreadProcessId(ProcessHandle, @ProcessID);
  ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessID);
  SnapHandle := CreateToolHelp32Snapshot(TH32CS_SNAPTHREAD, ProcessID);
  ThreadEntry.dwSize := SizeOf(ThreadEntry);
  Find := Thread32First(SnapHandle, ThreadEntry);
    while Find do
      begin
        if ProcessID = ThreadEntry.th32OwnerProcessID then
          begin
            ThreadsID := ThreadEntry.th32ThreadID;
            Break;
          end;
        Find := Thread32Next(SnapHandle, ThreadEntry);
      end;
  CloseHandle(SnapHandle);
  OpenThread(THREAD_ALL_ACCESS, False, ThreadsID);
  SuspendThread(ThreadsID);
  CloseHandle(ProcessHandle);
end;
Проверял значения ThreadsID по самому отладчику, также пробовал вставлять значения и отдельно(уже зная номер потока), но не работает, хотя сама функция SuspendThread возвращает "счет времени предыдущей приостановки работы потока" а не "-1", тобишь всё нормально должно быть, но не работает.

Что я делаю неправильно?

Последний раз редактировалось Winexcel; 01.08.2016 в 17:46.
Winexcel вне форума Ответить с цитированием
Старый 01.08.2016, 18:31   #2
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию

Проблема решена, ключевая проблема
Код:
  ThreadsID:=OpenThread(THREAD_ALL_ACCESS, False, ThreadsID);
Можно закрывать
Winexcel вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция не работает из потока ДралсяСошибками Общие вопросы Delphi 10 15.02.2015 14:31
Асинхронная загрузка и блокирование главного потока coNsept Общие вопросы .NET 1 24.11.2012 21:58
Принудительное завершение потока не работает :(! TEED! Работа с сетью в Delphi 3 06.06.2012 14:34
Рисование в заголовке главного окна не работает под Windows 7 в темах Aero vlad1 C++ Builder 0 06.04.2011 21:08
Использование визуального конструктора для главного окна. E13Mort Win Api 1 11.03.2010 00:37