Первый способ:

Code:

uses

Windows, SysUtils;

 

procedure DeleteMe;

var

BatchFile: TextFile;

BatchFileName: string;

ProcessInfo: TProcessInformation;

StartUpInfo: TStartupInfo;

begin

{ создаём бат-файл в директории приложения }

BatchFileName := ExtractFilePath(ParamStr(0)) + '$$336699.bat';

 

{ открываем и записываем в файл }

AssignFile(BatchFile, BatchFileName);

Rewrite(BatchFile);

 

Writeln(BatchFile, ':try');

Writeln(BatchFile, 'del "' + ParamStr(0) + '"');

Writeln(BatchFile,

   'if exist "' + ParamStr(0) + '"' + ' goto try');

Writeln(BatchFile, 'del "' + BatchFileName + '"');

CloseFile(BatchFile);

 

FillChar(StartUpInfo, SizeOf(StartUpInfo), $00);

StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;

StartUpInfo.wShowWindow := SW_HIDE;

 

if CreateProcess(nil, PChar(BatchFileName), nil, nil,

    False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo,

    ProcessInfo) then

begin

   CloseHandle(ProcessInfo.hThread);

   CloseHandle(ProcessInfo.hProcess);

end;

 

end;

 

 

Ниже приведены два примера, которые при создании потоков позволяют обойтись без класса TThread, используя API функции CreateThread, SuspendThread, ResumeThread и TerminateThread.

 Пример 1:

 Поместите на форму 2 окошка редактирования (edit) и 6 кнопок. Далее приведён сам код:

Есть handle запущенного PE файла. Как определить откуда он был запущен?

 

Я так предполагаю что getmodulefilename как и GetModuleHandle

работает в рамках только своего процесса.

 

А решить твою задачу .. можно так:

Тут парочка моих любимых функций

Автор: Gert v.d. Venis

Описание:

Данный компонент получает хэндл(handle) любого запущенного окна и даёт возможность отправить по указанному хэндлу любые комбинации нажатия клавиш.

Совместимость: Все версии Delphi

Компонент Sendkeys:

Следующий пример изменяет приоритет приложения. Изменение приоритета следует использовать с осторожностью - т.к. присвоение слишком высокого приоритета может привети к медленной работе остальных программ и системы в целом. См. Win32 help for SetThreadPriority() function.

 

 

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

Главной идеей, положенной в основу синхронизации потоков в Win32 является использование объектов синхронизации и функций ожидания. Объекты могут находиться в одном из двух состояний Signaled или Not Signaled. Функции ожидания блокируют выполнение потока до тех пор, пока заданный объект находится в состоянии Not Signaled. Таким образом, поток, которому необходим эксклюзивный доступ к ресурсу, должен выставить какой-либо объект синхронизации в несигнальное состояние, а по окончании сбросить его в сигнальное. Остальные потоки должны перед доступом к этому ресурсу вызвать функцию ожидания, которая позволит им дождаться освобождения ресурса.

Рассмотрим, какие объекты и функции синхронизации предоставляет нам Win32 API.

 

Читать из реестра HKEY_DYN_DATA\PerfStats\StatData соответствующий ключ Kernel \CPUUsage.

или

Если внутренняя переменная hPrevInst не равна нулю, то она содержит дескриптор предыдущего запущенного экземпляра вашей программы. Вы просто находите открытое окно по его дескриптору и, при необходимости, выводите на передний план. Весь код расположен в файле .DPR file, НЕ в модуле. Строки, которые вам необходимо добавить к вашему .DPR-файлу, в приведенном ниже примере помечены {*}.

 

Code:

function IsRunning( sName : string ) : boolean;

var

han : THandle;

ProcStruct : PROCESSENTRY32; // from "tlhelp32" in uses clause

sID : string;

begin

Result := false;

// Get a snapshot of the system

han := CreateToolhelp32Snapshot( TH32CS_SNAPALL, 0 );

if han = 0 then

   exit;

// Loop thru the processes until we find it or hit the end

ProcStruct.dwSize := sizeof( PROCESSENTRY32 );

if Process32First( han, ProcStruct ) then

   begin

     repeat

       sID := ExtractFileName( ProcStruct.szExeFile );

       // Check only against the portion of the name supplied, ignoring case

       if uppercase( copy( sId, 1, length( sName ) ) ) = uppercase( sName ) then

         begin

           // Report we found it

           Result := true;

           Break;

         end;

     until not Process32Next( han, ProcStruct );

   end;

// clean-up

CloseHandle( han );

end;

 

  

Code:

procedure TForm1.Button1Click(Sender: TObject);

VAR

Wnd : hWnd;

buff: ARRAY [0..127] OF Char;

begin

ListBox1.Clear;

Wnd := GetWindow(Handle, gw_HWndFirst);

WHILE Wnd <> 0 DO

BEGIN {Не показываем:}

IF (Wnd <> Application.Handle) AND {-Собственное окно}

IsWindowVisible(Wnd) AND {-Невидимые окна}

(GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}

(GetWindowText(Wnd, buff, sizeof(buff)) <> 0) {-Окна без заголовков}

THEN BEGIN

GetWindowText(Wnd, buff, sizeof(buff));

ListBox1.Items.Add(StrPas(buff));

END;

Wnd := GetWindow(Wnd, gw_hWndNext);

END;

ListBox1.ItemIndex := 0;

end;

 

 

Code:

procedure TForm1.Button1Click(Sender: TObject);

var

ProcessID: DWORD;

ProcessHandle: THandle;

ThreadHandle: THandle;

begin

ProcessID := GetCurrentProcessID;

ProcessHandle := OpenProcess(PROCESS_SET_INFORMATION,

   false, ProcessID);

SetPriorityClass(ProcessHandle, REALTIME_PRIORITY_CLASS);

ThreadHandle := GetCurrentThread;

SetThreadPriority(ThreadHandle, THREAD_PRIORITY_TIME_CRITICAL);

end;