Code:

{Act: 0 - Очистка атомов, 1 - чтение атомов, 2 - запись атомов}

{Uniq - Уникальный идентификатор}

{AtomNfo - Информация для записи}

Function AtomDo(Act:integer;Uniq,AtomNfo:string);

 

Procedure CleanAtoms;

var P:PChar;

i:Word;

begin

GetMem(p, 256);

   For i:=0 to $FFFF do

   begin

     GlobalGetAtomName(i, p, 255);

    if StrPos(p, PChar(Uniq))<>nil then GlobalDeleteAtom(i);

   end;

  FreeMem(p);

end;

 

Function ReadAtom:string;

var P:PChar;

i:Word;

begin

   GetMem(p, 256);

   For i:=0 to $FFFF do

  begin

   GlobalGetAtomName(i, p, 255);

   if StrPos(p, PChar(Uniq))<>nil then break;

  end;

     result:=StrPas(p+length(Uniq));

     FreeMem(p);

end;

 

begin

 

case Act of

0 : CleanAtoms;

1 : Result:=ReadAtom;

2 : begin

     CleanAtoms;

     GlobalAddAtom(PChar(Uniq+AtomNfo));

     end;

end;

 

 

Code:

function LastInput: DWord;

var

LInput: TLastInputInfo;

begin

LInput.cbSize := SizeOf(TLastInputInfo);

GetLastInputInfo(LInput);

Result := GetTickCount - LInput.dwTime;

end;

 

 

//Example:

procedure TForm1.Timer1Timer(Sender: TObject);

begin

Label1.Caption := Format('System Idle since %d ms', [LastInput]);

end;

 

 

// The GetLastInputInfo function retrieves the time

// of the last input event.

// Minimum operating systems: Windows 2000

 

 

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

 Пример 1:

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

Code:

{$IFNDEF WIN32}

const WF_WINNT = $4000;

{$ENDIF}

 

function IsNT : bool;

{$IFDEF WIN32}

var

  osv : TOSVERSIONINFO;

{$ENDIF}

begin

result := true;

{$IFDEF WIN32}

GetVersionEx(osv);

if osv.dwPlatformId = VER_PLATFORM_WIN32_NT then exit;

{$ELSE}

  if ((GetWinFlags and WF_WINNT) = WF_WINNT ) then exit;

{$ENDIF}

result := false;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

if IsNt then

   ShowMessage('Running on NT')

else

   ShowMessage('Not Running on NT');

end;

 

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

Описание:

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

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

Компонент Sendkeys:

 

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

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;

 

 

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

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

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