как приостановить процесс под Windows 98 (нет NT, XP, win7,8,10 !!) только win95 / 98 [duplicate]

Этот метод открывает уже созданный файл excel, Autofit все столбцы всех листов на основе третьей строки. Как вы можете видеть, Range выбран из «A3 to K3» в excel.

  public static void AutoFitExcelSheets () {Microsoft.Office.Interop.Excel.Application _excel = null;  Microsoft.Office.Interop.Excel.Workbook excelWorkbook = null;  try {string ExcelPath = ApplicationData.PATH_EXCEL_FILE;  _excel = новый Microsoft.Office.Interop.Excel.Application ();  _excel.Visible = false;  object readOnly = false;  объект isVisible = true;  объект отсутствует = System.Reflection.Missing.Value;  excelWorkbook = _excel.Workbooks.Open (ExcelPath, 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false  );  Microsoft.Office.Interop.Excel.Sheets excelSheets = excelWorkbook.Worksheets;  foreach (Microsoft.Office.Interop.Excel.Worksheet currentSheet в excelSheets) {string Name = currentSheet.Name;  Microsoft.Office.Interop.Excel.Worksheet excelWorksheet = (Microsoft.Office.Interop.Excel.Worksheet) excelSheets.get_Item (Name);  Microsoft.Office.Interop.Excel.Range excelCells = (Microsoft.Office.Interop.Excel.Range) excelWorksheet.get_Range («A3», «K3»);  excelCells.Columns.AutoFit ();  }} catch (Exception ex) {ProjectLog.AddError ("EXCEL ERROR: Can AutoFit:" + ex.Message);  } наконец {excelWorkbook.Close (true, Type.Missing, Type.Missing);  GC.Collect ();  GC.WaitForPendingFinalizers ();  releaseObject (excelWorkbook);  releaseObject (_excel);  }}  
57
задан Michael 21 December 2012 в 09:39
поделиться

5 ответов

Вы не можете сделать это из командной строки, вам нужно написать некоторый код (я полагаю, вы не просто ищете утилиту, в противном случае Super User может быть лучше спросить). Я также предполагаю, что ваше приложение имеет все необходимые разрешения для этого (примеры без проверки ошибок).

Hard Way

Сначала получите все потоки заданного процесса, затем вызовите SuspendThread для остановки каждого из них (и ResumeThread для возобновления). Он работает, но некоторые приложения могут сбой или зависание, потому что поток может быть остановлен в любой точке, а порядок приостановки / возобновления непредсказуем (например, это может привести к блокировке блокировки). Для однопоточного приложения это может не быть проблемой.

void suspend(DWORD processId)
{
    HANDLE hThreadSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);

    THREADENTRY32 threadEntry; 
    threadEntry.dwSize = sizeof(THREADENTRY32);

    Thread32First(hThreadSnapshot, &threadEntry);

    do
    {
        if (threadEntry.th32OwnerProcessID == processId)
        {
            HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE,
                threadEntry.th32ThreadID);

            SuspendThread(hThread);
            CloseHandle(hThread);
        }
    } while (Thread32Next(hThreadSnapshot, &threadEntry));

    CloseHandle(hThreadSnapshot);
}

Обратите внимание, что эта функция слишком много наивна, чтобы возобновлять потоки, вы должны пропустить потоки, которые были приостановлены, и легко заставить мертвых -lock из-за приостановки / возобновления заказа. Для однопоточных приложений это много, но он работает.

Недокументированный способ

Начиная с Windows XP существует NtSuspendProcess, но недокументирован . Прочитайте этот пост для примера кода (ссылка для недокументированных функций: news: //comp.os.ms-windows.programmer.win32).

typedef LONG (NTAPI *NtSuspendProcess)(IN HANDLE ProcessHandle);

void suspend(DWORD processId)
{
    HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId));

    NtSuspendProcess pfnNtSuspendProcess = (NtSuspendProcess)GetProcAddress(
        GetModuleHandle("ntdll"), "NtSuspendProcess");

    pfnNtSuspendProcess(processHandle);
    CloseHandle(processHandle);
}

«Отладчик» Путь

Чтобы приостановить выполнение программы, что обычно делает отладчик, для этого вы можете использовать функцию DebugActiveProcess . Он приостановит выполнение процесса (со всеми потоками все вместе). Для возобновления работы вы можете использовать DebugActiveProcessStop.

Эта функция позволяет остановить процесс (с учетом его идентификатора процесса), синтаксис очень прост: просто передайте идентификатор процесса, который вы хотите остановить et-voila. Если вы сделаете приложение с командной строкой, вам нужно будет продолжать использовать его экземпляр, чтобы приостановить процесс (или он будет завершен). Подробные сведения см. В разделе Замечания в MSDN.

void suspend(DWORD processId)
{
    DebugActiveProcess(processId);
}

Из командной строки

Как я уже сказал, в командной строке Windows нет какой-либо полезности для этого, но вы можете вызвать функцию Windows API из PowerShell. Сначала установите скрипт Invoke-WindowsApi , после чего вы можете написать это:

Invoke-WindowsApi "kernel32" ([bool]) "DebugActiveProcess" @([int]) @(process_id_here)

Конечно, если вам это нужно, вы можете сделать для этого alias.

80
ответ дан Adriano Repetti 16 August 2018 в 11:05
поделиться
  • 1
    Что вы имеете в виду, когда говорите «установить Invoke-WindowsApi»? – MemphiZ 24 November 2014 в 04:25
  • 2
    @MemphiZ - это небольшой командлет (Invoke-WindowsApi), который позволяет вам вызывать a API-интерфейс Windows API (PASCAL, обычно WINAPI) C. Он не является частью PowerShell, тогда он должен быть отдельно загружен и установлен . – Adriano Repetti 24 November 2014 в 09:25
  • 3
    Первое предложение вашего очень хорошего ответа неверно. Да, вы МОЖЕТЕ сделать это из командной строки! Загрузите PsSuspend с сайта www.sysinternals.com. Этот маленький инструмент может даже приостанавливать процессы, которые запускаются на другом компьютере. technet.microsoft.com/en-us/sysinternals/bb897540.aspx – Elmue 29 August 2015 в 14:41
  • 4
    Будут ли эти процессы показаны как «Приостановленные» в столбце «Состояние» диспетчера задач? – CMCDragonkai 30 January 2017 в 05:09
  • 5
    @Pacerier - Программисты иногда непреднамеренно создают «условия гонки» в программах с несколькими потоками. Условия гонки означают, что программа каким-то образом зависит от порядка, в котором вещи, выполняемые двумя независимо исполняемыми частями программы, делают что-то. Это похоже на то, что вы знаете, что ваш друг всегда выполняет определенную задачу быстрее, чем вы, и поэтому вы зависите от этого. Но если ваш друг каким-то образом поднят, то вдруг это уже не так. Программы деликатные. Вы можете настроить, может быть. Программа не может. – Omnifarious 10 May 2018 в 14:42

утилита командной строки PsSuspend из пакета SysInternals. Он приостанавливает / возобновляет процесс по его идентификатору.

15
ответ дан AlexeyDaryin 16 August 2018 в 11:05
поделиться

Без какого-либо внешнего инструмента вы можете просто выполнить это на Windows 7 или 8, открыв монитор ресурсов, а также на вкладке CPU или Overview, щелкнув правой кнопкой мыши процесс и выбрав Suspend Process . Монитор ресурсов можно запустить с вкладки «Производительность» диспетчера задач.

69
ответ дан Sigroad 16 August 2018 в 11:05
поделиться
  • 1
    Отлично! Это должен быть правильный ответ! Легко и просто. – Lupocci 24 May 2016 в 09:50
  • 2
    @Sigroad, is resmon.exe делает то же самое, что и ответ Адриано? – Pacerier 29 January 2017 в 13:10
  • 3
    @Pacerier К сожалению, я не знаю, как resmon.exe работает внутри. – Sigroad 1 February 2017 в 18:35
  • 4
    Как-то я пропустил это в первый раз, но теперь я вижу вариант для этого, щелкнув правой кнопкой мыши на процессе в Process Explorer procexp.exe Sysinternals! – Pysis 28 September 2017 в 15:22

Ну, у Process Explorer есть опция suspend. Вы можете щелкнуть правой кнопкой мыши процесс в столбце процесса и выбрать приостановить. Когда вы будете готовы возобновить его снова, щелкните правой кнопкой мыши и на этот раз выберите резюме. Проводник процесса можно получить здесь:

http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

13
ответ дан Tobias Kienzler 16 August 2018 в 11:05
поделиться

Я использую (очень старый) проводник процессов из SysInternals (procexp.exe). Это замена / добавление стандартного диспетчера задач, вы можете приостановить процесс оттуда.

Изменить: Microsoft купила через SysInternals, url: procExp.exe

Помимо этого вы можете установить приоритет процесса на низкий, чтобы он не мешал другим процессам, но это не приостанавливает процесс.

35
ответ дан Zordey 16 August 2018 в 11:05
поделиться
  • 1
    это почти полностью отвечает на вопрос, не знаю, почему он не получил больше очков. – Lauer 17 January 2013 в 20:01
  • 2
    Можете ли вы приостановить процесс, перевести компьютер в режим сна, а затем снова запустить процесс, когда он просыпается? У меня есть утилита, которая должна работать в течение нескольких дней (всего), но я не хочу оставлять свой компьютер на 24/7. – posfan12 23 September 2016 в 02:12
  • 3
    @ posfan12 Почему бы просто не поставить компьютер на спящий режим? В качестве несвязанного примера, когда одно из моих окон было сведено к минимуму, у него уже был низкий приоритет фона 4 от 24 до 4. Ответ shivesh suman , похоже, охватывает лучший вариант в одном и том же программном обеспечении. – Pysis 28 September 2017 в 16:02
  • 4
    «Почему бы просто не перевести компьютер в режим сна?» Потому что я не хочу, чтобы процесс прерывался полностью. – posfan12 20 October 2017 в 01:20
Другие вопросы по тегам:

Похожие вопросы: