Этот метод открывает уже созданный файл 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); }}
Вы не можете сделать это из командной строки, вам нужно написать некоторый код (я полагаю, вы не просто ищете утилиту, в противном случае Super User может быть лучше спросить). Я также предполагаю, что ваше приложение имеет все необходимые разрешения для этого (примеры без проверки ошибок).
Сначала получите все потоки заданного процесса, затем вызовите 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
.
утилита командной строки PsSuspend из пакета SysInternals
. Он приостанавливает / возобновляет процесс по его идентификатору.
Без какого-либо внешнего инструмента вы можете просто выполнить это на Windows 7 или 8, открыв монитор ресурсов, а также на вкладке CPU или Overview, щелкнув правой кнопкой мыши процесс и выбрав Suspend Process . Монитор ресурсов можно запустить с вкладки «Производительность» диспетчера задач.
procexp.exe
Sysinternals!
– Pysis
28 September 2017 в 15:22
Ну, у Process Explorer есть опция suspend. Вы можете щелкнуть правой кнопкой мыши процесс в столбце процесса и выбрать приостановить. Когда вы будете готовы возобновить его снова, щелкните правой кнопкой мыши и на этот раз выберите резюме. Проводник процесса можно получить здесь:
http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
Я использую (очень старый) проводник процессов из SysInternals (procexp.exe). Это замена / добавление стандартного диспетчера задач, вы можете приостановить процесс оттуда.
Изменить: Microsoft купила через SysInternals, url: procExp.exe
Помимо этого вы можете установить приоритет процесса на низкий, чтобы он не мешал другим процессам, но это не приостанавливает процесс.
Invoke-WindowsApi
), который позволяет вам вызывать i> a API-интерфейс Windows API i> (PASCAL
, обычноWINAPI
) C. Он не является частью PowerShell, тогда он должен быть отдельно загружен и установлен i>. – Adriano Repetti 24 November 2014 в 09:25