Новости Win API VCL Прочее Железо

 

  1. Как убрать мою программу из списка Alt+Ctrl+Del ?
  2. Как запустить программу , н-р Calc.exe ?
  3. Как изменить громкость звуков в Windows ?
  4. Как создать не прямоугольную форму ?
  5. Как запустить программу при загрузке Windows
  6. Как открыть почтовую программу с нужным адресом ?
  7. Как сделать ссылку - URL ?
  8. Наиболее часто задаваемые вопросы по SystemTray:
               1) что такое System Tray ?
               2) как мне перенести свою программу на Tray ?
               3) что такое иконка на Tray ?
               4) как добавить иконку на Tray ?
               5) а как ее там изменить ?
               6) а как удалить иконку с Tray ?
               7) как мне узнать о воздействии мыши на иконку,
                       находящуюся на Tray ?
               8) многие программы показывают Pop-Up меню при щелчке
                       на их иконке, как этого добиться ?
               9) многие программы минимизируясь, оказываются на Tray,
                    как это сделать ?
             10) всегда ли все вышесказанное будет работать ?
             11) а есть ли официальная информация по System Tray ?
             12) как сделать пункт "по умолчанию" в Pop-Up меню выделенным ?
  9. Как проверить наличие соединения с интернетом ?
  10. Как инсталлировать на время работы программы свои шрифты?
  11. Как спрятать приложение от показа при нажатии Alt+Tab?
  12. Как подавить реакцию Windows на CTRL+ALT+DEL?
  13. Как убрать кнопку программы с Панели Задач?
  14. Как программно нажать на кнопку "Пуск"?
  15. Как переключить язык из программы ?
  16. Как спрятать панель задач?
  17. Как получить список запущенных приложений?
  18. Как изменить заголовок окна чужого приложения?
  19. Как рисовать на рабочем столе?
  20. Как использовать анимированные курсоры в программе?
  21. Как узнать и изменить текущее разрешение экрана ?
  22. Как осуществить поддержку NetMouse/IntelliMouse,
    (функций по прокрутке текста средней кнопкой/wheel-ом) ?
  23. Как получить список всех установленных в системе шрифтов ?
  24. Как добавить/удалить/показать папку/программу в меню "Пуск" ?
  25. Как узнать состояние клавиш Ctrl, Alt, Shift, CapsLock, Insert, NumLuck, ScrollLock ?
  26. Как удалить файл в корзину ?
  27. Как добавить ссылку на мой файл в меню Пуск|Документы ?
  28. Как устанавить свою картинку (WallPaper) на рабочий стол ?
  29. Как сделать, что бы при минимизации (свертывании) программа исчезала из таскбара?
  30. Как в системное меню формы пункт добавить?
  31. Как перетаскивать окна без заголовка?
    (н-р в окнах произвольной формы или при BorderStyle:=None )
  32. Как отформатировать диск в Win32?
  33. Как набрать номер с помощью модема в Win32?
  34. Как показать иконку, ассоциированной с данным типом файла?
  35. Как вызвать диалог 'Найти файлы и паки' проводника?
  36. Как узнать переменные окружения (environment variable) DOS, например path?
  37. Как вызвать стандартное окно About?
  38. Как вызвать стандартный диалог форматирования дисков?
  39. Как использовать функцию Shell API SHBrowseForFolder,
    чтобы позволить пользователю выбрать каталог?
  40. Как можно имея полное имя файла, вывести для него стандартный
    диалог "Свойства"?
  41. Как прочесть атрибут файла "последний доступ"?
  42. Малоизвестные команды Windows 9xx для запуска из командной
    строки
  43. Как закрыть активное приложение?


Как убрать мою программу из списка Alt+Ctrl+Del?

...
function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall; external 'KERNEL32.DLL';
...
implementation
...
procedure TForm1.Button1Click(Sender: TObject);
begin
// скрыть - можно эту процедурку закинуть в OnCreate,
// тогда приложение автоматически будет спрятано
  if not (csDesigning in ComponentState) then
          RegisterServiceProcess(GetCurrentProcessID, 1);

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
// Показать
  if not (csDesigning in ComponentState) then
       RegisterServiceProcess(GetCurrentProcessID, 0);
end;

- в начало -

Как запустить программу , н-р Calc.exe ?

Один из вариантов:

  WinExec('calc.exe', SW_SHOWNORMAL);
  // где 1-ый параметр - путь+имя программы
  //       2-й параметр    - в каком состоянии ее запустить (в нормальном, в свернутом, распахнутом)

- в начало -

Как изменить громкость звуков в Windows ?

uses MMSystem;

// возвращает громкость
function GetWaveVolume: DWord;
   var
        Woc : TWaveOutCaps;
         Volume : DWord;

begin
  result:=0;
  if WaveOutGetDevCaps(WAVE_MAPPER, @Woc, sizeof(Woc)) =MMSYSERR_NOERROR then
        begin
           if Woc.dwSupport and WAVECAPS_VOLUME = WAVECAPS_VOLUME then
               begin
                  WaveOutGetVolume(WAVE_MAPPER, @Volume);
                  Result := Volume;
               end;
        end;
end;

// устанавливает громкость
procedure SetWaveVolume(const AVolume: DWord);
var

     Woc : TWaveOutCaps;
begin
       if WaveOutGetDevCaps(WAVE_MAPPER, @Woc, sizeof(Woc)) =MMSYSERR_NOERROR then
                   begin
                     if Woc.dwSupport and WAVECAPS_VOLUME = WAVECAPS_VOLUME then
                              WaveOutSetVolume(WAVE_MAPPER, AVolume);
                   end;
end;

// проверка (вешаем на батон)
procedure TForm1.Button1Click(Sender: TObject);
begin
Beep;
end;

// вещаем на батон
procedure TForm1.Button2Click(Sender: TObject);

var
     LeftVolume: Word;
     RightVolume: Word;

begin
  // левый динамик
  LeftVolume := StrToInt(Edit1.Text);
  // правый
  RightVolume := StrToInt(Edit2.Text);
  SetWaveVolume(MakeLong(LeftVolume, RightVolume));
end;

// выводим громкость (вещаем на батон)
procedure TForm1.Button3Click(Sender: TObject);
begin

Label1.Caption := IntToStr(GetWaveVolume);
end;

 

- в начало -

 

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

Добавте в раздел uses модуль ShellApi

uses ...,ShellApi;
...
var

Rgn:thandle;
...
// многоугольное

procedure TForm1.FormCreate(Sender:TObject);

const
Region : array [0..2] of TPoint =((x:0;y:100),(x:50;y:0),(x:100;y:100));

// Задаем координаты точек региона ( в данном случае - треугольник ) 
begin

  rgn:=0;
Rgn:=CreatePolygonRgn(Region,3,0);
// число 3 - кол-во точек региона
  if rgn<>0 then SetWindowRgn(Handle,Rgn,true);

end;
или

uses ...,ShellApi;
...
var

Rgn:thandle;
...
// элептическое

procedure TForm1.FormCreate(Sender:TObject);

begin
  rgn:=0;
Rgn:=CreateRoundRectRgn(0,0,Width,Height,
          Width,Height);

  if rgn<>0 then SetWindowRgn(Handle,Rgn,true);

end;

   Так же можно испольсовать следущие фунуции Win32 API для создания регионов:

CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreatePolyPolygonRgn, CreateRectRgn, CreateRectRgnIndirect, CreateRoundRectRgn, ExtCreateRegion - они описаны в справке по Win32 API.

    Созданные регионы можно комбинировать - CombineRgn (перед вызовом SetWindowRgn)

Перед выходом обязательно уничтожте созданные регионы:

procedure TForm1.FormDestroy(Sender:TObject);
begin
if Rgn<>0 then setwindowrgn(handle,0,true);
deleteobject(rgn);
rgn:=0;
end;

P.S.: если в ваш новый регион  не попал участок заголовка, то вам придется самостоятельно определить способы перемещения вашего окна и все кнопки (н-р закрыть), корорые не попадут на форму ...

- в начало -

Автозапуск при загрузке Windows

    Для запуска программы при каждой загрузке Windows надо добавить в реестре в  
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\
CurrentVersion\Run
вашу программу
Чтобы программа запустилась только при следующей загрузке -
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\
CurrentVersion\RunOnce

- в начало -

Как открыть почтовую программу с нужным адресом

добавте в uses - ShellApi  и вызвайте фунуцию WinApi.  Н-р для адреса 13_vlad.mail.ru :
ShellExecute(Handle,'open',PChar('mailto:'+'13_vlad@mail.ru'),'','',SW_Show);

- в начало -

Как сделать ссылку - URL ?

добавте в uses - ShellApi  и вызвайте фунуцию WinApi.  Н-р  :
ShellExecute(0, Nil,PChar(Label1.Caption), Nil, Nil, SW_NORMAL);

- в начало -

Hаиболее часто задаваемые вопросы по SystemTray

Hаиболее часто задаваемые вопросы по SystemTray.
Автор - Лев Серебряков (Lev Serebryakov),
2:5030/219.33@fidonet или lev@spb.runnet.ru
Версия 1.1

пример для Дельфи (компонент и пример использования компонента)

! для Дельфи надо подключить модуль ShellApi, !
он содержит ниже описанную функцию Shell_NotifyIcon

1) Что такое System Tray ? О чем идет речь ?
Если Вы в операционной ситеме Windows'95 или Windows NT 4.0 пользуетесь оболочкой Explorer, то справа на TaskBar'е Вы должны были видеть "углубленную" область в которой, обычно, помещаются часы, переключатель клавиатуры, регулятор громкости и некоторые другие утилиты. Они изображаются маленькими иконками и для них существуют ToolTip'ы как для кнопок ToolBar'ов. При щелчке или двойном щелчке по такой иконке программа обычно выполняет действие по умолчанию, а при щелчке правой кнопкой показывает Pop-Up меню. Hа уровне оболочки System Tray это приложение, поддерживающее окно, которое вы видите как "углубленную" область и некоторый сервис для работы с этим окном.

2) Как мне перенести свою программу на Tray ?
Это типичный вопрос программиста, пишущего какую-нибудь утилиту,работающую в Background во время всей работы операционной системы (в DOS такие утилиты делались TSR-программами). Hо вопрос
поставлен не корректно. Обычно задавае этот вопрос программист имеет в виду примерно следующее : "Моя программа работает [почти] все время в минимизированном состоянии и очень жалко места под ее кнопку на
TaskBar'е. Как мне сделать, что бы при минимизации [старте|все время] моя программа представлялась иконкой на System Tray'е и отвечала на сообщения мыши от этой иконки ?"Ответ на этот вопрос состоит из нескольких частей. Смотри следующие вопросы и ответы на них.


3) Что такое иконка на System Tray ?
Ответ на этот вопрос объясняет некорректность вопроса 2. Иконка на Tray'е это просто картинка, а не окно какой-либо программы (исследование системы с помощью Microsoft Spy++ for Windows 95 показывает, что это не окно вообще). System Tray отслеживает события мыши над иконкой и, в случае надобности, показывает ToolTip для этой иконки. Так же он отсылает сообщения о всех действиях мыши над иконкой окну, которое поместило иконку на Tray. Таким образом, нельзя поместить программу на Tray. Любая программа может добавить стоько иконок на Tray, сколько ей необходимо. При этом главное окно программы не обязано исчезать или минимизироватся - примером может служить Microsoft Internet Mail, помещающая иконку "конверт" на Tray в случае появления новых писем.

4) Как добавить иконку на Tray ?
Для работы с SystemTray существует всего одна функция. Вот ее Си-прототип:
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(DWORD dwMessage, // message identifier
                                                                                 PNOTIFYICONDATA pnid // pointer to
structure);
Эта функция описана в заголовочном файле Win32-SDK "shellapi.h", включаемом в программу при включении "windows.h". Параметр dwMessage может принимать одно из трех значений: NIM_ADD, NIM_DELETE, NIM_MODIFY. Для добавления иконки он должен быть установлен в NIM_ADD.
Параметр pnid имеет тип PNOTIFYDATA, который описан как:
typedef struct _NOTIFYICONDATA { // nid
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
char szTip[64];
} NOTIFYICONDATA, *PNOTIFYICONDATA;

Поля структуры NOTIFYICONDATA имеют следующий смысл:
cbSize - размер структуры, должен быть
sizeof(NOTIFYICONDATA).
hWnd - дескриптор окна, которое будет получать события мыши над иконкой.
uID - уникальный идентификатор иконки. Идентификатор должен быть уникален в пределах окна - обработчика, передаваемого в hWnd.
uFlags - битовое поле, определяющее какое из следующих полей несет действительную информацию.
Может быть одним из следующих значений: NIF_ICON,
NIF_MESSAGE, NIF_TIP или их OR-комбинацией.
uCallbackMessage - сообщение, передаваемое окну - обработчику при событиях мыши. Желательно получать номер сообщения вызовом RegisterWindowMessage(), но допускаются и значения WM_USER+N, где N > 0.
hIcon - дескриптор иконки, помещаемой на Tray.
szTip - текст для ToolTip'а, если szTip[0] = 0x00, то ToolTip'а не будет.
Таким образом, для добавления иконки на Tray необходимо заполнить экземпляр структуры NOTIFYICONDATA и вызвать функцию Shell_NotifyIcon() с параметром NIM_ADD и указателем на
заполненный экземпляр структуры.При добавлении иконки необходимо заполнить поля cbSize, hWnd,
uID, uFlags, uCallbackMessage, hIcon. Поле szTip можно оставить пустым, если вам не нужен ToolTip. Поле uFlags должно содержать как минимум NIF_MESSAGE | NIF_ICON.

5) Я добавил иконку на Tray, а как ее там изменить ?
После добавления иконки на Tray можно менять саму иконку, ToolTip и сообщение, посылаемое окну. Для этого необходимо заполнить экземпляр структуры NOTIFYICONDATA и вызвать функцию Shell_NotifyIcon() с параметром NIM_MODIFY и указателем на заполненный экземпляр структуры. При изменении иконки необходимо заполнить поля cbSize, hWnd, uID, uFlags и поля, отвечающие за параметры иконки, которые вы
хотите менять. При этом uFlags должен содержать комбинацию флагов, описывающую поля, которые необходимо менять.


6) А как удалить иконку с Tray ?
Для удаления иконки вы должны знать ее ID и дескриптор окна-обработчика сообщений.
Для удаления иконки с Tray надо вызвать функцию Shell_NotifyIcon() с параметром NIM_DELETE и указателем на экземпляр структуры NOTIFYICONDATA, у которого должны быть заполнены следующие поля: cbSize, hWnd, uID.


7) Как мне узнать о воздействии мыши на иконку, находящуюся на Tray ?
При добавлении иконки на Tray вы указывали окно - обработчик сообщения и сообщение (CallbackMessage). Теперь окно, указанное вами будет при любых событиях мыши, происходящих над иконкой получать сообщение, указанное при добавлении иконки. При этом параметры lParam и wParam будут задействованы следующим образом: (UINT)wParam - содержит ID иконки, над которой произошло событие
(UINT)lParam - содержит стандартное событие мыши, такое как WM_MOUSEMOVE или WM_LBUTTONDOWN.При этом, информация о клавишах смены регистра, так же как и местоположения события, передаваемые при стандартных "настоящих" сообщениях мыши, теряются. Hо положение курсора можно узнать функцией GetCursorPos(), а состояние клавиш смены регистра - функцией GetKeyState(),
описанных в winuser.h.


8) Многие программы показывают Pop-Up меню при щелчке на их иконке, помещенной на Tray, как этого добиться ?
Вы должны обрабатывать сообщение, указанное вами при добавлении иконки на Tray. При значении (UINT)lParam, равном WM_RBUTTONDOWN (это обычно для Pop-Up меню по правой кнопке), или любому другому необходимому вам, вы должны вызовом функции GetCursorPos() получить позицию курсора в момент события (вряд ли пользователь успеет убрать мышь за время обработки сообщения, особенно если
он ожидает меню), получить дескриптор Pop-Up меню одним из многих способов (LoadMenu(), GetSubMenu(), CreateMenu(), и т.д.) и выполнить следующий код:
SetForegroundWindow(hWnd);
TrackPopupMenuEx(hMenu,TPM_HORIZONTAL|TPM_LEFTALIGN,x, y,hWnd,NULL);
DestroyMenu(hMenu);
PostMessage(hWnd,WM_USER,0,0);

где hWnd - дескриптор окна, которое будет обрабатывать команду
меню, hMenu - дескриптор меню, x и y - позиция курсора. Для
подробностей смотрите Win32 SDK Help по функции TrackPopupMenuEx.


9) Многие программы минимизируясь, оказываются на Tray, как это сделать ?
Hа самом деле, не "программа оказывается на Tray", а только иконка помещается на Tray, а главное окно программы скрывается. Для достижения такого результата вам надо обрабатывать сообщение
WM_SIZE, и при значении wParam, равном SIZE_MINIMIZED вы должны выполнить примерно следующую последовательность действий: добавить иконку на Tray и скрыть окно - вызвать ShowIndow(hWnd, SW_HIDE).
Когда произойдет действие, которое должго активировать вашу программу - WM_LBUTTONDBLCLK или WM_LBUTTONDOWN (или то, что нравится вам), вы должны удалить иконку и вызвать ShowWindow(hWnd,SW_SHOW) или ShowWindow(hWnd,SW_SHOWMAXIMIZED).

пример скрытия окна программы для Дельфи:
ShowWindow(Application.Handle, sw_Hide);

10) Всегда ли все вышесказанное будет работать ?
Hет ! Все вышенаписанное работает только при использовании в операционных системах Windows 95 и Windows NT 4.0 оболочки Explorer, и при разрешенном System Tray. В случае, если не происходит запуска systray.exe (запускаетс автоматически Explorer'ом при старте) или используется другая оболочка (DashBoard, Program Manager, File Manager), функция Shell_NotifyIcon() будет возвращать при вызове FALSE и не
выполнять ни каких действий. Еще раз повторю: System Tray - это возможность оболочки, а не
операционной системы !

11) А есть ли официальная информация по System Tray ?
Да, есть. Есть маленький пример в Win32 SDK: SDKRoot\Samples\Win32\Win95\TrayNot\*.*
Hу и конечно описание в документации функции Shell_NotifyIcon()
и структуры NOTIFYICONDATA.
Так же можно посмотреть Microsoft Knowledge Base:
PSS ID Number: Q128129
PSS ID Number: Q134237
PSS ID Number: Q139408

Описание этой функции можно найти в прилагаемой к Дельфи справке - Win32.hlp


12) Как сделать пункт "по умолчанию" в Pop-Up меню выделенным ?
Вообще-то, это вопрос не относящийся к System Tray, а относящийся к меню. Hо можно ответить и на него.
Устанавливается пункт "по умолчанию" в любом меню функцией API SetMenuDefaultItem(HMENU hMenu, UINT uItem, UINT fByPos), подробности - в Win32 SDK документации. Пункт "По умолчанию" не влияет на работу меню - это чисто интерфейсное выделение пункта меню полужирным (bold) шрифтом.

- в начало -

Как проверить наличие соединения с интернетом ?

uses
     Windows, SysUtils, Registry, WinSock, WinInet;
type
  TConnectionType = (ctNone, ctProxy, ctDialup);
  function ConnectedToInternet : TConnectionType;
  function RasConnectionCount : Integer;
implementation
//For RasConnectionCount =======================
const
  cERROR_BUFFER_TOO_SMALL = 603;
  cRAS_MaxEntryName = 256;
  cRAS_MaxDeviceName = 128;
  cRAS_MaxDeviceType = 16;
type
  ERasError = class(Exception);
    HRASConn = DWord;
    PRASConn = ^TRASConn;
    TRASConn = record
    dwSize: DWORD;
    rasConn: HRASConn;
    szEntryName: Array[0..cRAS_MaxEntryName] Of Char;
    szDeviceType : Array[0..cRAS_MaxDeviceType] Of Char;
    szDeviceName : Array [0..cRAS_MaxDeviceName] of char;
  end;
  TRasEnumConnections =function (RASConn: PrasConn; { buffer to receive Connections data }
                                                        var BufSize: DWord; { size in bytes of buffer }
                                                        var Connections: DWord { number of Connections written to buffer }
                                                         ): LongInt; stdcall;


//End RasConnectionCount =======================
function ConnectedToInternet: TConnectionType;
var
  Reg : TRegistry;
  bUseProxy : Boolean;
  UseProxy : LongWord;
begin
  Result := ctNone;
  Reg := TRegistry.Create;
  with REG do
    try
    try
     RootKey := HKEY_CURRENT_USER;
     if OpenKey('\Software\Microsoft\Windows\CurrentVersion\Internet settings',False) then
    begin
      //I just try to read it, and trap an exception
      if GetDataType('ProxyEnable') = rdBinary then
             ReadBinaryData('ProxyEnable', UseProxy, SizeOf(LongWord) )
           else begin
                      bUseProxy := ReadBool('ProxyEnable');
                          if bUseProxy then  UseProxy := 1 else  UseProxy := 0;
                  end;
       if (UseProxy <> 0) and ( ReadString('ProxyServer') <> '' ) then Result := ctProxy;
     end;
   except
    //Obviously not connected through a proxy
   end;
   finally
  Free;
  end;
  //We can check RasConnectionCount even if dialup networking is not installed
  //simply because it will return 0 if the DLL is not found.

  if Result = ctNone then
     begin
       if RasConnectionCount > 0 then Result := ctDialup;
     end;
end;


function RasConnectionCount : Integer;
var
  RasDLL : HInst;
  Conns : Array[1..4] of TRasConn;
  RasEnums : TRasEnumConnections;
  BufSize : DWord;
  NumConns : DWord;
  RasResult : Longint;
begin
  Result := 0;
  //Load the RAS DLL
  RasDLL := LoadLibrary('rasapi32.dll');
  if RasDLL = 0 then exit;
  try
    RasEnums := GetProcAddress(RasDLL,'RasEnumConnectionsA');
    if @RasEnums = nil then raise ERasError.Create('RasEnumConnectionsA not found in rasapi32.dll');
    Conns[1].dwSize := Sizeof (Conns[1]);
    BufSize := SizeOf(Conns);
    RasResult := RasEnums(@Conns, BufSize, NumConns);
    If (RasResult = 0) or (Result = cERROR_BUFFER_TOO_SMALL) then Result := NumConns;
  finally
   FreeLibrary(RasDLL);
  end;
end;


- в начало -

Как инсталлировать на время работы программы свои шрифты?

Добавить фонт (.fon, .fot, .fnt, .ttf) в систему можно след. образом:

{$IFDEF WIN32}
AddFontResource( PChar( my_font_PathName { AnsiString } ) );
{$ELSE}
var
ss : array [ 0..255 ] of Char;

AddFontResource ( StrPCopy ( ss, my_font_PathName ));
{$ENDIF}
SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 );

Убрать его по окончании работы:

{$IFDEF WIN32}
RemoveFontResource ( PChar(my_font_PathName) );
{$ELSE}
RemoveFontResource ( StrPCopy ( ss, my_font_PathName ));
{$ENDIF}
SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 );

Где my_font_PathName - полный путь к файлу со шрифтом.


- в начало -

Каким образом можно спрятать приложение от показа при нажатии Alt+Tab?

Пример (работает только в Win'95/98):

var WnHnd : Integer;
........................................................
WnHnd := GetWindowLong(Application.Handle, GWL_EXSTYLE);
WnHnd := WnHnd or WS_EX_TOOLWINDOW;
SetWindowLong(Application.Handle, GWL_EXSTYLE, WnHnd);

- в начало -

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

// Включение режима
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, 0, 0);
// Выключение режима
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, 0, 0);

- в начало -

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

ShowWindow(Application.Handle,SW_HIDE);

- в начало -

Как программно нажать на кнопку "Пуск"?

SendMessage(GetWindow(FindWindow('Shell_TrayWnd',nil), GW_CHILD), WM_LBUTTONDOWN, MK_LBUTTON, LOWORD(5) + HIWORD(20));

- в начало -

Как переключить язык из программы ?

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

  // русский
 SetActiveKeyboardLayout(russian);


  // английский
 SetActiveKeyboardLayout(
latin);
end;

или

LoadKeyboardLayout('00000409', KLF_ACTIVATE); // английский
LoadKeyboardLayout('00000419', KLF_ACTIVATE); // русский

- в начало -

Как спрятать панель задач?

//спрятать
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;

- в начало -

Как получить список запущенных приложений?

// процедура выводит список запущенных приложений в ListBox1
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

     // не показываем:
     // cобственное окно
      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;

- в начало -

Как изменить заголовок окна чужого приложения?

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

- в начало -

Как рисовать на рабочем столе?

procedure DrawOnScreen;
var

  DC:HDC;
  DesktopCanvas:TCanvas;
begin
  // получили DC экрана
   DC:=GetDC(0);
   // (или DC:=GetDC(GetDesktopWindow) для рабочего стола)
   try
     DesktopCanvas:=TCanvas.Create;
     DesktopCanvas.Handle:=DC;
           ..................
    // здесь рисуем на Canvas экрана
          ..................
  finally
    ReleaseDC(0,DC);
    DesktopCanvas.Free;
  end;
end;

- в начало -

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

var
  h : THandle;
begin
  // загрузка курсора в память
  h := LoadImage(0,'Magic.ani', IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE);
  if h = 0 then ShowMessage('Cursor not loaded')  else
      begin
         // регистрируем в системе c уникальным номером
        Screen.Cursors[1] := h;
        // присваиваем номер курсора св-ву  Cursor нужного объекта
        Form1.Cursor := 1;
      end;
end;

- в начало -

Как узнать текущее разрешение экрана ?

узнать :

Screen.Width и Screen.Height

изменить:

procedure ChangeDisplayResolution(x, y : word);
var
   dm : TDEVMODE;
begin
   ZeroMemory(@dm, sizeof(TDEVMODE));
   dm.dmSize := sizeof(TDEVMODE);
   dm.dmPelsWidth := x;
   dm.dmPelsHeight := y;
   dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;
   ChangeDisplaySettings(dm, 0);
end;

- в начало -

Как осуществить поддержку NetMouse/IntelliMouse
(функций по прокрутке текста средней кнопкой/wheel-ом) ?

   Для Дельфи 1-3 обрабатывайте сообщение WM_MOUSEWHEEL, Дельфи 5 содержит события для
tWinControl - OnMouseWheel, OnMouseWheelDown, OnMouseWheelUp.

- в начало -

Как получить список всех установленных в системе шрифтов ?

  Список всех шрифтов находится тут - screen.fonts

// Пример :
// Для того, чтобы использовать этот пример, установите TComboBox и TRichEdit в форме.
//  Во время создания формы, список имен шрифтов загружается в комбинированный список.
//  Когда  выбирается шрифт в комбинированном списоке , выбранный шрифт
// устанавливается в  Richedite.

procedure TForm1.FormCreate(Sender: TObject);
begin

ComboBox1.Items := Screen.Fonts;
end;

procedure TForm1.ComboBox1Click(Sender: TObject);
begin
RichEdit1.Font.Name := ComboBox1.Items[ComboBox1.ItemIndex];
end;

- в начало -

 

Как добавить/удалить/показать папку/программу в меню "Пуск" ?

  Для этого необходимо поместить на форму компонент для посылки DDE запросов - объект типа TDdeClientConv. Для определенности назовем его DDEClient. Затем добавим метод для запросов к PROGMAN:

function TForm2.ProgmanCommand(Command:string):boolean;
var

  macrocmd:array[0..88] of char;
begin
  DDEClient.SetLink( 'PROGMAN', 'PROGMAN');
  // Устанавливаем связь по DDE
  DDEClient.OpenLink;
  // Подготавливаем ASCIIZ строку
  strPCopy(macrocmd,'['+Command+']');
  ProgmanCommand :=DDEClient.ExecuteMacro(MacroCmd,false);
// Закрываем связь по DDE
  DDEClient.CloseLink;
end;

При вызове ProgmanCommand возвращает true, если посылка макроса была успешна. Система команд (основных) приведена ниже:

Create(Имя группы, путь к GRP файлу) - Создать группу с именем "Имя группы", причем в нем могут быть пробелы и знаки препинания. Путь к GRP файлу можно не указывать, тогда он создастся в каталоге Windows.
Delete(Имя группы) - Удалить группу с именем "Имя группы"
  ShowGroup(Имя группы, состояние)   - Показать группу в окне, причем состояние - число, определяющее параметры окна:
1-нормальное состояние + активация
2-миним.+ активация
3-макс. + активация
4-нормальное состояние
5-Активация
   AddItem(командная строка, имя раздела, путь к иконке, индекс иконки (с 0), Xpos,Ypos, рабочий каталог, HotKey, Mimimize) - Добавить раздел к активной группе. В командной строке, имени размера и путях допустимы пробелы, Xpos и Ypos - координаты иконки в окне, лучше их не задавать, тогда PROGMAN использует значения по умолчанию для свободного места. HotKey - виртуальный код горячей клавиши. Mimimize - тип запуска, 0-в обычном окне, <>0 - в минимизированном.
   DeleteItem(имя раздела) -   Удалить раздел с указанным именем в активной группе

Пример использования:
ProgmanCommand('CreateGroup(Комплекс программ для каталогизации литературы,)');
ProgmanCommand('AddItem('+path+'vbase.hlp,Справка по VBase,'+ path +' vbase.hlp, 0, , , '+ path + ',,)');
где path - строка типа String, содержащая полный путь к каталогу ('C:\Catalog\');

- в начало -

Как узнать состояние клавиш Ctrl, Alt, Shift, CapsLock, Insert, NumLuck, ScrollLock ?

О состоянии клавиатуры дают информацию следующие функции: GetKeyState, GetAsyncKeyState, GetKeyboardState.

function AltKeyDown : boolean;
begin
   result:=(Word(GetKeyState(VK_MENU)) and $8000)<>0;
end;

function CtrlKeyDown : boolean;
begin
    result:=(Word(GetKeyState(VK_CONTROL)) and $8000)<>0;
end;

function ShiftKeyDown : boolean;
begin
    result:=(Word(GetKeyState(VK_SHIFT)) and $8000)<>0;
end;

function CapsLock : boolean;
begin
   result:=(GetKeyState(VK_CAPITAL) and 1)<>0;
end;

function InsertOn : boolean;
begin
   result:=(GetKeyState(VK_INSERT) and 1)<>0;
end;

function NumLock : boolean;
begin
    result:=(GetKeyState(VK_NUMLOCK) and 1)<>0;
end;

function ScrollLock : boolean;
begin
      result:=(GetKeyState(VK_SCROLL) and 1)<>0;
end;

- в начало -

Как удалить файл в корзину ?

uses ShellAPI;
function DeleteFileWithUndo( sFileName : string ) : boolean;
var fos : TSHFileOpStruct;
begin
  sFileName:= sFileName+#0;
  FillChar( fos, SizeOf( fos ), 0 );
  with fos do
    begin
      wFunc := FO_DELETE;
      pFrom := PChar( sFileName );
      fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION
                    or   FOF_SILENT;
    end;
  Result := ( 0 = ShFileOperation( fos ) );
end;

- в начало -

Как добавить ссылку на мой файл в меню Пуск|Документы ?

uses ShellAPI, ShlOBJ;
procedure AddToStartDocumentsMenu( sFilePath : string );
begin
   SHAddToRecentDocs( SHARD_PATH, PChar( sFilePath ) );
end;

// Например -
// AddToStartDocumentsMenu( 'c:\windows\MyWork.txt' );

- в начало -

Как устанавить свою картинку (WallPaper) на рабочий стол ?

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 WriteString('', 'TileWallpaper', '1' )
                         else WriteString('', 'TileWallpaper', '0' );
       end;
reg.Free;
// Оповещаем всех о том, что мы
// изменили системные настройки
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, Nil, SPIF_SENDWININICHANGE );
end;

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

- в начало -

Как сделать, что бы при минимизации (свертывании) программа исчезала из таскбара?

При этом происходит сообщение WM_SYSCOMMAND, его то и надо перехватить

// Добавте в описание формы:
Type

   TMain = class(TForm)
....
protected
Procedure WMGetSysCommand(var Message :TMessage); message WM_SYSCOMMAND;
end
;
.....
// Обработка сообщения WM_SYSCOMMAND
//(перехват минимизации окна)

Procedure TForm1.WMGetSysCommand(var Message : TMessage) ;
Begin
   if (Message.wParam = SC_MINIMIZE) then form1.Visible:=False
       Else Inherited;
End;

- в начало -

Как в системное меню формы пункт добавить?

// Добавте в описание формы:
Type

   TMain = class(TForm)
....
protected
Procedure WMGetSysCommand(var Message :TMessage); message WM_SYSCOMMAND;
end
;
.....
// Обработка сообщения WM_SYSCOMMAND
//(перехват минимизации окна)

Procedure TForm1.WMGetSysCommand(var Message : TMessage) ;
Begin
  inherited;
  // если индификатор наш - $F200
  if Message.CmdType and $FFF0 = $F200  then
     // то обрабатываем нажатие
     ShowMessage('Hello');
End;

// в обработчик FormCreate:
---------------------------------
// добавить разделитель

AppendMenu(GetSystemMenu(Form1.Handle, False), MF_SEPARATOR, 0, '');
// добавить пункт меню с индификатором $F200
AppendMenu(GetSystemMenu(Form1.Handle, False), MF_STRING, $F200, '&Hello');

- в начало -

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

type
  TMainForm = class(TForm)
  ....
  public
    // обработка сообщения WM_NCHITTEST
   procedure WMNCHitTest(var Message : TWMNCHitTest); message
                                                                                   WM_NCHITTEST;
end
;
...
procedure TMainForm.WMNCHitTest(var Message : TWMNCHitTest);
begin
  // проверяем на попадение в заданную область
  // координаты относительно экpана 

  if (Message.XPos-Left < 100) and (Message.YPos-Top < 100) then
       // если да, то возвращаем значение - заголовок
      Message.Result := HTCAPTION
   else
      // иначе говорим, что это слиентская область окна
      Message.Result := HTNOWHERE;
end;

- в начало -

Как отформатировать диск в Win32?

// функция ShellAPI функция ShFormatDrive().
// Пример:

const SHFMT_DRV_A = 0;
const SHFMT_DRV_B = 1;

const SHFMT_ID_DEFAULT = $FFFF;

const SHFMT_OPT_QUICKFORMAT = 0;
const SHFMT_OPT_FULLFORMAT = 1;
const SHFMT_OPT_SYSONLY = 2;

const SHFMT_ERROR = -1;
const SHFMT_CANCEL = -2;
const SHFMT_NOFORMAT = -3;

function SHFormatDrive(hWnd : HWND;
                        Drive : Word;
                        fmtID : Word;
                        Options : Word) : Longint
    stdcall; external 'Shell32.dll' name 'SHFormatDrive';


procedure TForm1.Button1Click(Sender: TObject);
var

   FmtRes : longint;
begin
   try
     FmtRes:= ShFormatDrive(Handle,
                            SHFMT_DRV_A,
                            SHFMT_ID_DEFAULT,
                            SHFMT_OPT_QUICKFORMAT);
     case FmtRes  of
         SHFMT_ERROR : ShowMessage('Ошибка форматирования диска');
         SHFMT_CANCEL :
              ShowMessage('Отмена форматирования пользователем');
         SHFMT_NOFORMAT : ShowMessage('No Format')
     else
         ShowMessage('Диск отформатирован');
     end;
   except
   end;

end;

- в начало -

Как набрать номер с помощью модема в Win32?

// Используйте функцию Windows API CreateFile() чтобы получить
// дескриптор порта, и стандартные  функции ввода-вывода для
// связи с полученным портом.
// Пример:

var
     hCommFile : THandle;
  procedure TForm1.Button1Click(Sender: TObject);
  var
    PhoneNumber : string;
    CommPort : string;
     NumberWritten : LongInt;
  begin
     PhoneNumber := 'ATDT 1-555-555-1212' + #13 + #10;
     CommPort := 'COM2';
     {Открываем comm порт}
      hCommFile := CreateFile(PChar(CommPort),
               GENERIC_WRITE,
                                       0,
                                       nil,
                                       OPEN_EXISTING,
                                       FILE_ATTRIBUTE_NORMAL,
                                       0);
     if hCommFile=INVALID_HANDLE_VALUE then
       begin
         ShowMessage('Unable to open '+ CommPort);
        exit;
     end;

{Дозваниваемся по номеру}
     NumberWritten:=0;
     if WriteFile(hCommFile,
                      PChar(PhoneNumber)^,
                      Length(PhoneNumber),
                      NumberWritten,
                     nil) = false then begin
                ShowMessage('Не могу записать в порт  ' + CommPort);
           end;
          end;

procedure TForm1.Button2Click(Sender: TObject);
   begin
      {Закрываем порт}
      CloseHandle(hCommFile);
   end;

- в начало -

Как показать иконку, ассоциированной с данным типом файла?

// ShellApi функция ExtractAssociatedIcon()
// Пример:
uses ShellApi;
procedure TForm1.Button1Click(Sender: TObject);

  var
       Icon : hIcon;
       IconIndex : word;

begin
   IconIndex := 1;
   Icon := ExtractAssociatedIcon(HInstance,
                                     Application.ExeName,
                                      IconIndex);
   DrawIcon(Canvas.Handle, 10, 10, Icon);
end;

- в начало -

Как вызвать диалог 'Найти файлы и папки' проводника?

//  Приведенный пример показывает использование DDE
//  для вызова диалога 'Найти файлы и паки' Explorerа.
// Диалог открывается на каталоге "C:\Download".

procedure TForm1.Button1Click(Sender: TObject);
begin

   with TDDEClientConv.Create(Self) do
     begin
        ConnectMode := ddeManual;
        ServiceApplication := 'explorer.exe';
        SetLink( 'Folders', 'AppProperties');
        OpenLink;
        ExecuteMacro('[FindFolder(, C:\DOWNLOAD)]', False);
        CloseLink;
         Free;
     end;
end;

- в начало -

Как узнать переменные окружения (environment variable) DOS, например path?

//   Windows API -  функция
//    GetDOSEnvironment() для  Win16 и
//    GetEnvironmentStrings() для Win32.


procedure TForm1.Button1Click(Sender: TObject);
   var
     p : pChar;
  begin
     Memo1.Lines.Clear;
     Memo1.WordWrap := false;
     {$IFDEF WIN32}
        p := GetEnvironmentStrings;
     {$ELSE}
         p := GetDOSEnvironment;
      {$ENDIF}
        while p^ <> #0 do begin
            Memo1.Lines.Add(StrPas(p));
            inc(p, lStrLen(p) + 1);
         end;
       {$IFDEF WIN32}
        FreeEnvironmentStrings(p);
       {$ENDIF}
end;

- в начало -

Как вызвать стандартное окно About?

uses ShellAPI;

procedure ShowAbout;
begin
ShellAbout(Form1.Handle, 'Название программы', 'Авторские права на программу', Application.Icon.Handle);
end;

- в начало -

Как вызвать стандартный диалог форматирования дисков?

uses ShellAPI;

procedure ShowAbout;
begin
ShellExecute(Application.Handle, Pchar('Open'),Pchar('C:\Windows\Rundll32.exe'), Pchar('Shell32.dll,SHFormatDrive'), Pchar('C:\Windows'),SW_SHOWNORMAL);
end;

// автор InSAn

- в начало -

Как использовать функцию Shell API SHBrowseForFolder,
чтобы позволить пользователю выбрать каталог?

uses ShellAPI, ShlObj;

procedure TForm1.Button1Click(Sender: TObject);
var
  TitleName : string;
  lpItemID : PItemIDList;
  BrowseInfo : TBrowseInfo;
  DisplayName : array[0..MAX_PATH] of char;
  TempPath : array[0..MAX_PATH] of char;
begin
  FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
  BrowseInfo.hwndOwner := Form1.Handle;
  BrowseInfo.pszDisplayName := @DisplayName;
  TitleName := 'Please specify a directory';
  BrowseInfo.lpszTitle := PChar(TitleName);
  BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
  lpItemID := SHBrowseForFolder(BrowseInfo);
  if lpItemId <> nil then begin
     SHGetPathFromIDList(lpItemID, TempPath);
     ShowMessage(TempPath);
     GlobalFreePtr(lpItemID);
  end;
end;

- в начало -

Как можно имея полное имя файла, вывести для него стандартный диалог "Свойства"?

unit ....;

interface

uses Windows, Messages, ShlObj, SysUtils, Classes, Forms;

const
{SHObjectProperties Flags}
OPF_PRINTERNAME = $01;
OPF_PATHNAME = $02;

function SHObjectProperties(Owner: HWND; Flags: UINT; ObjectName: Pointer;

                InitialTabName: Pointer): LongBool; stdcall;

type
TShellObjectType = (sdPathObject, sdPrinterObject);
TShellObjectTypes = set of TShellObjectType;

{MAIN FUNCTION}
function ShowObjectPropertiesDialog(ObjectName: TFileName;

                  ObjectType: TShellObjectType; InitialTab: String): Boolean;

function ShellObjectTypeEnumToConst(ShellObjectType: TShellObjectType): UINT;
function ShellObjectTypeConstToEnum(ShellObjectType: UINT):TShellObjectType;

implementation

uses Controls, ShellAPI, ActiveX;

const
Shell32 = 'shell32.dll';
SHObjectProperties_Index = 178;

var
ShellDLL: HMODULE;


function SHObjectProperties; external Shell32 index
SHObjectProperties_Index;

function ShowObjectPropertiesDialog(ObjectName: TFileName;
ObjectType: TShellObjectType; InitialTab: String): Boolean;

var
  ObjectNameBuffer: Pointer;
  TabNameBuffer: Pointer;
begin
{Allocate a buffer to hold the object name, long enough for UNICODE if need be.}
  GetMem(ObjectNameBuffer, (Length(ObjectName) + 1) * SizeOf(WideChar));
  try {..finally}

{If WinNT, convert object name string to UNICODE. Otherwise, just copy to buffer.}
  if (SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT) then begin
     StringToWideChar(ObjectName, PWideChar(ObjectNameBuffer),
        (Length(ObjectName) + 1));
  end {if}
   else begin
      StrPCopy(PChar(ObjectNameBuffer), ObjectName);
  end; {else}

  {Allocate a buffer to hold the initial tab name, long enough for UNICODE if need be.}
  GetMem(TabNameBuffer, (Length(InitialTab) + 1) * SizeOf(WideChar));
try {..finally}

  {If WinNT, convert initial tab name string to UNICODE. Otherwise, just copy to buffer.}
   if (SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT) then begin
      StringToWideChar(InitialTab, PWideChar(TabNameBuffer),
        (Length(InitialTab) + 1));
  end {if}
  else begin
      StrPCopy(PChar(TabNameBuffer), InitialTab);
   end; {else}

  {Execute the dialog and translate the result to the return value.}
  Result := SHObjectProperties(Application.Handle,
  ShellObjectTypeEnumToConst(ObjectType),
  ObjectNameBuffer, TabNameBuffer);

  {Ensure tab name buffer is freed.}
 
finally
    FreeMem(TabNameBuffer);
  end; {try..finally}

{Ensure object name buffer is freed.}
finally
  FreeMem(ObjectNameBuffer);
end; {try..finally}
end;


function ShellObjectTypeEnumToConst(ShellObjectType: TShellObjectType): UINT;
begin

  case (ShellObjectType) of
        sdPathObject: Result := OPF_PATHNAME;
        sdPrinterObject: Result := OPF_PRINTERNAME;
    else Result := 0;
  end; {case}
end;

function ShellObjectTypeConstToEnum(ShellObjectType: UINT):
TShellObjectType;
begin
case (ShellObjectType) of
     OPF_PATHNAME: Result := sdPathObject;
     OPF_PRINTERNAME: Result := sdPrinterObject;
  else Result := sdPathObject;
end; {case}
end;

initialization

  {Get a reference to the SHELL32.DLL library}
  ShellDLL := LoadLibrary(PChar(Shell32));

finalization

{Free reference to the SHELL32.DLL library}
  FreeLibrary(ShellDLL);

end.

- в начало -

Как прочесть атрибут файла "последний доступ"?

procedure TForm1.Button1Click(Sender: TObject);
var

  FileHandle : THandle;
  LocalFileTime : TFileTime;
  DosFileTime : DWORD;
  LastAccessedTime : TDateTime;
  FindData : TWin32FindData;
begin
  FileHandle := FindFirstFile('AnyFile.FIL', FindData);
  if FileHandle <> INVALID_HANDLE_VALUE then begin
      Windows.FindClose(Handle);
       if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY)
             = 0 then begin
              FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
              FileTimeToDosDateTime(LocalFileTime,
              LongRec(DosFileTime).Hi,LongRec(DosFileTime).Lo);
              LastAccessedTime := FileDateToDateTime(DosFileTime);
              Label1.Caption := DateTimeToStr(LastAccessedTime);
          end;
      end;
end;

- в начало -

Малоизвестные команды Windows 9xx для запуска из командной
строки

Можно использовать из приложения Дельфи с помощью следующей конструкции:

ShellExecute(Application.Handle,Pchar('Open'),Pchar('C:\Windows\Rundll32.exe'),
Pchar(команда),Pchar('C:\Windows'),SW_SHOWNORMAL);
где: команда - одна из перечисленных ниже

Например
ShellExecute(Application.Handle,
Pchar('Open'),Pchar('C:\Windows\Rundll32.exe'),
Pchar('krnl386.exe,exitkernel'),
Pchar('C:\Windows'),SW_SHOWNORMAL); - выход из Windows без любых
сообщений/вопросов

Команды:

"rundll32 shell32,Control_RunDLL" - Выводит "Панель управления"

"rundll32 shell32,OpenAs_RunDLL" - Выводит окошко - "Открыть с помощью.."

"rundll32 shell32,ShellAboutA Info-Box" - Покозать окно "About Windows"

"rundll32 shell32,Control_RunDLL desk.cpl" - Открыть "Свойства Экрана"

"rundll32 user,cascadechildwindows" - Сортировка окон "Каскадом" (Как в Win 3.x)

"rundll32 user,tilechildwindows" - Сместить Окна в низ

"rundll32 user,repaintscreen" - Обновить рабочий стол

"rundll32 shell,shellexecute Explorer" - Запустить проводник Windows.

"rundll32 keyboard,disable" - Вырубить Клавиатуру! (Вот Это я понимаю Заподло!)

"rundll32 mouse,disable" - Вырубить Мышь! (У Шефа Будет припадок:)))

"rundll32 user,swapmousebutton" - Поменять Местами клавиши Мыша! (Во мля! и этого Дядя Билли не забыл!)

"rundll32 user,setcursorpos" - Сместить курсор крысы в левый верхний угол

"rundll32 user,wnetconnectdialog" - Вызвать окно "Подключение сетевого диска"

"rundll32 user,wnetdisconnectdialog" - Вызвать окно "Отключение сетевого диска"

"rundll32 user,disableoemlayer" - Спровоцировать сбой!!! (Знаю, сам сразу не поверил, но это FUсKт...)

"rundll32 diskcopy,DiskCopyRunDll" - Показать окно "Copy Disk"

"rundll32 rnaui.dll,RnaWizard" - Вывод окна "Установка Связи", с ключем "/1" - без окна

"rundll32 shell32,SHFormatDrive" - Окно "Форматирование: Диск3,5(А)" вызвать

"rundll32 shell32,SHExitWindowsEx -1" - Перегрузить Explorer

"rundll32 shell32,SHExitWindowsEx 1" - Выключение Компутера.

"rundll32 shell32,SHExitWindowsEx 0" - Завершить Работу Текущего Пользователя

"rundll32 shell32,SHExitWindowsEx 2" Windows-98-PC boot

"rundll32 krnl386.exe,exitkernel" - выход из Windows без любых сообщений/вопросов

"rundll rnaui.dll,RnaDial "MyConnect" - Вызвать окошко "Установка связи" с соединением "MyConnect"

"rundll32 msprint2.dll,RUNDLL_PrintTestPage" - выбрать в появившемся меню принтер и послать, а него тест

"rundll32 user,setcaretblinktime" - установить новую частоту мигания курсора

"rundll32 user,setdoubleclicktime" - установить новую скорость двойного нажатия

"rundll32 sysdm.cpl,InstallDevice_Rundll" - установить non-Plug&Play оборудование

из рассылки "Реестр Windows"
Архив рассылки лежит на http://subscribe.ru/archive/comp.soft.win.registrywindows/

- в начало -

Как закрыть активное приложение?

{Автор: Dale Berry
Данная функция позволяет завершить выполнение любой активной программы по её classname или заголовку окна.}

procedure KillProgram(Classname : string; WindowTitle : string);
const
  PROCESS_TERMINATE = $0001;
var
  ProcessHandle : THandle;
  ProcessID: Integer;
  TheWindow : HWND;
begin
  TheWindow := FindWindow(Classname, WindowTitle);
  GetWindowThreadProcessID(TheWindow, @ProcessID);
  ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId);
  TerminateProcess(ProcessHandle,4);
end;

{Комментарии Xianguang Li 
В Delphi 5, при компиляции получается следующая ошибка :
  Incompatible types: 'String' and 'PChar'.
После изменения выражения
  
TheWindow := FindWindow(ClassName, WindowTitle)
на
  
TheWindow := FindWindow(PChar(ClassName), PChar(WindowTitle)) ,
Нормально откомпилировалось.
И ещё: если мы не знаем ClassName или WindowTitle программы, которую мы хотим убить,
то мы не сможем её завершить. Причина в том, что нельзя вызвать функцию в виде:
  
KillProgram(nil, WindowTitle)
  или
  
KillProgram(ClassName, nil).
Компилятор не позволяет передать nil в переменную типа String.
Итак, я изменил объявление
  
KillProgram(ClassName: string; WindowTitle: string)
на
  KillProgram(ClassName: PChar; WindowTitle: PChar),
вот теперь функция действительно может завершить любое приложение, если вы не знаете
ClassName или WindowTitle этого приложения. }

- в начало -

 


Hosted by uCoz