15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту

Убрать команду "закрыть" из системного меню
Сделать серой кнопку "закрыть" в заголовке формы
Подавить реакцию Windows на CTRL+ALT+DEL, ALT-TAB, CTRL-ESC
Копирование файлов
Переключение языков из программы
Как отловить нажатия клавиш в системе.
Как установить картинку рабочего стола из программы.
Как скрыть ТаскБар.
Получение списка запущеных приложений.
Как избавиться от "торможения".
Динамические массивы
Как перезагрузить компьютер.
Как создать Ini-файл в директории программы.
Как получить дату последнего изменения файла.
Изменение функций кнопок мышки
Изменение заголовка "чужого" окна
Изменение положения курсора мыши

 
 
Следующий текст убирает команду закрыть из системного меню и одновременно
делает серой кнопку закрыть в заголовке формы: 
procedure TForm1.FormCreate(Sender: TObject); 
var hMenuHandle:HMENU; 
begin 
 hMenuHandle := GetSystemMenu(Handle, FALSE); 
 IF (hMenuHandle <> 0) THEN 
  DeleteMenu(hMenuHandle, SC_CLOSE, MF_BYCOMMAND); 
end; 

 

Вверх


 

Как подавить реакцию Windows на CTRL+ALT+DEL, ALT-TAB, CTRL-ESC

В некоторых случаях (например, при работе в полноэкранном режиме, показе своей презентации или экранной заставки ...) бывает полезно заблокировать перечисленные комбинации клавиш. Они блокируются при работе системы в режиме "экранная заставка" , который в свою очередь несложно включить и выключить:


// Включение режима
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, 0, 0);
// Выключение режима
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, 0, 0);
Кстати, SystemParametersInfo имеет еще кучу полезных ключей  SPI_****, подробности см. в win32.hlp

 

Вверх


Копирование файлов

Copyfile('C:\1.txt','C:\files\2.txt',0);

где первый параметр - путь и имя нужного файла, а второй путь и имя нового(скопированого) файла

Если же необходимо задавать имена файлов через Edit, то:

Copyfile(PChar(edit1.text),PChar(edit2.text),0);

 

Вверх


Переключение языков из программы

Для переключения языка применяется вызов LoadKeyboardLayout:

var russian, latin: HKL; 

 russian:=LoadKeyboardLayout('00000419', 0);
 latin:=LoadKeyboardLayout('00000409', 0);

-- -- -- -- -- где то в  программе --- --- --- 

 SetActiveKeyboardLayout(russian);

 

Вверх


 

Как отловить нажатия клавиш в системе
Для этого используется функция GetAsyncKeyState(KeyCode)
в качестве параметра используются коды клавиш (например
A - 65). GetAsyncKeyState возвращает не нулевое значение
если, во время ее вызова нажата указаная клавиша.

 

//----Этот пример отлавливает нажатие клавиши "A"
//Этот код необходимо поместить в процедуру обработки
//таймера с интервалом "1"
if getasynckeystate(65)<>0 then showmessage('A - pressed');
//----------
Решение задачи "как отловить все клавиши" я предоставляю 
Вам. Если возникли какие-нибудь вопросы - пишите. 

 

Вверх


Как установить картинку рабочего стола из программы?

 

program wallpapr;
uses Registry, WinProcs;

procedure SetWallpaper(sWallpaperBMPPath:String;bTile:boolean);
var
  reg : TRegIniFile;
begin
// Изменяем ключи реестра
// HKEY_CURRENT_USER
//   Control Panel\Desktop
//     TileWallpaper (REG_SZ)
//     Wallpaper (REG_SZ)
  reg := TRegIniFile.Create('Control Panel\Desktop' );
  with reg do begin
    WriteString( '', 'Wallpaper',  
      sWallpaperBMPPath );
    if( bTile )then
    begin
      WriteString('', 'TileWallpaper', '1' );
    end else begin
      WriteString('', 'TileWallpaper', '0' );
    end;
  end;
  reg.Free;
// Оповещаем всех о том, что мы 
// изменили системные настройки
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, Nil, 
  {Эта строка - продолжение предыдущей}SPIF_SENDWININICHANGE );
end;

 // пример установки WallPaper по центру рабочего стола
 SetWallpaper('c:\winnt\winnt.bmp', False );
//Эту строчку надо написать где-то в программе.

 

Вверх


 

Как скрыть ТаскБар?


//Спрятать

procedure TForm1.Button1Click(Sender: TObject);
var
  hTaskBar : THandle;
begin
  hTaskbar := FindWindow('Shell_TrayWnd', Nil);
  ShowWindow(hTaskBar, SW_HIDE);
end;

 

//Показать
procedure TForm1.Button2Click(Sender: TObject);
var
  hTaskBar : THandle;
begin
  hTaskbar := FindWindow('Shell_TrayWnd', Nil);
  ShowWindow(hTaskBar, SW_SHOWNORMAL);
end;

 

Для получения более детальной информации пишите.

 

Вверх


8.04.2000

Получение списка запущеных приложений.

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;

Вверх


Как избавиться от торможения?

Немодальные диалоговые окна, находящиеся на экране во время выполнения длительных операций, могут реагировать на действия пользователя очень медленно. Это ограничение Windows, и обойти его можно так:

while Flag do
begin
PerformOperation;
Application.ProcessMessages;
Flag:=ContinueOperation;
end;

 

Вверх


Динамические массивы

Иногда разработчик, работая с массивами, не знает какого размера массив ему нужен. Тогда Вам пригодится использование динамических массивов.

var
    intArray : array of integer;

При таком объявлении размер массива не указывается. Что бы использовать его дальше необходимо определить его размер (обратите внимание, что размер динамического массива можно устанавливать в программе)

begin
intArray:=(New(IntArray,100);  //Размер массива  100
end;

 

Вверх


Как перезагрузить компьютер?

Используйте соответствующий компонент.

 

Вверх


Как создать Ini-файл в директории программы?

По умолчанию ini-файл создается в Windows-директории (например: TIniFile.Create('MFile.ini' )), что приводит к "захламлению" оной. Более (эко-)логично (за исключением случаев, когда программа делается для CD-ROM) если ini-файл создается в той же директории что и главная программа. Вот пример чтения и записи ini файла из директории программы.

 
function ReadIni(ASection, AString : String) : String;
var
sIniFile: TIniFile;
sPath : String[60];
begin
GetDir(0,sPath);
sIniFile := TIniFile.Create(sPath + '\Name.INI');
Result := sIniFile.ReadString(ASection, AString, S); sIniFile.Free;
end;
 
procedure WriteIni(ASection, AString, AValue : String);
var
sIniFile: TIniFile;
sPath : String[60];
begin
GetDir(0,sPath);
sIniFile := TIniFile.Create(sPath + '\Name.INI');
sIniFile.WriteString(ASection, AString, AValue);
sIniFile.Free;
end;

(Прислал Стас)

 

Вверх


Как получить дату последнего изменения файла?

function GetFileDate(FileName: string): string;
var
FHandle: Integer;
begin
FHandle := FileOpen(FileName, 0);
  try
      Result := DateTimeToStr(FileDateToDateTime(FileGetDate(FHandle)));
  finally
      FileClose(FHandle);
  end;
end;

Вверх


 
Изменение функций кнопок мышки
Begin
//---------
SwapMouseButton(true);  // Поменять обратно - SwapMouseButton(false);
//---------
end;

 

Вверх


Изменение заголовка "чужого" окна

SetWindowText('Текущий заголовок', 'Желаемый');

Например:

Заменить заголовк окна "Блокнот" на "Мой НЕ Блокнот"
SetWindowText('Блокнот','Мой НЕ Блокнот');

Вверх


Изменение положения курсора мыши

  • Установка курсора мыши в определенное место

  • Чтобы установить курсор мыши в какое-либо место экрана необходимо воспользоваться функцией SetCursorPos(x,y);

    Например: Чтобы установить курсор в верхний левый угол монитора нужно написать следующий код: SetCursorPos(0,0);

  • Получение координат курсора

  • Для начала необходимо определить переменную pos типа TPoint.

    Сначала:

    //Вне процедуры!
    Type Tpoint = record
    x:integer;
    y:integer;
    end;

    Потом объявляете саму переменную : 

    Var
    Pos: TPoint;

    И собчтвенно получение координат:

    begin;
    GetCursorPos(pos);
    x:=pos.x;
    y:=pos.y;
    end;
     

    Вверх