Userland

Информация по сетям, железу, софту, программированию, практические советы пользователю, cтатьи.


Программирование

FAQ

 В этом разделе я попытался собрать все наиболее часто встречающиеся вопросы, касаемые программирования в Дельфи, Паскале и Си. Если вы можете пополнить список вопросов и ответов- пишите


Вопросы:

Как зашатдаунить NT?

Как программно убить приложение?

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

Как узнать серийный номер диска?

Как добавить документ в меню ПУСК - ДОКУМЕНТЫ?

Как подключить сетевой диск?

Проверка включенности клавиш

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

Как узнать путь к системному, текущему каталогу и к каталогу, где расположен Windows?

Как узнать частоту процессора?

Как узнать имя текущего принтера?

Как узнать платформу, версию ОС, номер версии?

Как определить тип, букву носителя, объем и свободное место?

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

Как зарегистрировать в системе горячую клавишу и назначить ей обработчик?


Ответы:

 

Как зашатдаунить NT?

procedure Shutdown (Name:String; // Имя машины
    Message:String; // Сообщение
    Delay:Integer; // Задержка перед рестартом
    Restart,CloseAll:Boolean);
var
    ph:THandle;
    tp,prevst:TTokenPrivileges;
    rl:DWORD;
begin
    OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,ph);
    LookupPrivilegeValue(Nil,'SeShutdownPrivilege',tp.Privileges[0].Luid);
    tp.PrivilegeCount:=1;
    tp.Privileges[0].Attributes:=2;
    AdjustTokenPrivileges(ph,FALSE,tp,SizeOf(prevst),prevst,rl);
    InitiateSystemShutdown(PChar(name),PChar(Message),Delay,Restart,CloseAll);
    ShowMessage(SysErrorMessage(GetLastError)); // Результат
end;

К началу

Как программно убить приложение?

Нужно отправить этому приложению сообщение WM_QUIT

PostMessage(FindWindow(nil,'Заголовок окна'), WM_QUIT, 0, 0);

Функция FindWindow   возвращает дескриптор окна. Первый параметр этой функции- класс окна, второй - заголовок окна.

Функция PostMessage отправляет сообщение оконному объекту. В данном случае это сообщение WM_QUIT, а дескриптор окна находится функцией FindWindow.

К началу

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

Для этого используется функция ShFormatDrive() из модуля ShellAPI.

Пример:

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('Error formatting the drive');
            SHFMT_CANCEL    : ShowMessage('User canceled formatting the drive');
            SHFMT_NOFORMAT : ShowMessage('No Format')
        else
            ShowMessage('Disk has been formatted');
   end;// case
    except
    end; // try

end; // procedure

К началу

Как узнать серийный номер диска?

procedure TForm1.Button1Click(Sender: TObject);

var
    VolumeName,
    FileSystemName : array [0..MAX_PATH-1] of Char;
    VolumeSerialNo : DWord;
    MaxComponentLength,
    FileSystemFlags : Integer;

begin
    GetVolumeInformation('C:\',VolumeName,MAX_PATH,@VolumeSerialNo,
    MaxComponentLength,FileSystemFlags,
    FileSystemName,MAX_PATH);
    Memo1.Lines.Add('VName = '+VolumeName);
    Memo1.Lines.Add('SerialNo = $'+IntToHex(VolumeSerialNo,8));
    Memo1.Lines.Add('CompLen = '+IntToStr(MaxComponentLength));
    Memo1.Lines.Add('Flags = $'+IntToHex(FileSystemFlags,4));
    Memo1.Lines.Add('FSName = '+FileSystemName);
end;

К началу

Как добавить документ в меню ПУСК - ДОКУМЕНТЫ?

Для этого воспользуемся  функцией SHAddToRecentDocs из модуля ShlObj.

uses ShlOBJ;

procedure TForm1.Button1Click(Sender: TObject);

var
    s : string;

begin
    s := 'C:\My Documents\APIFAQ.doc';
    SHAddToRecentDocs(SHARD_PATH, pChar(s));
end; 

К началу

Как подключить сетевой диск?

procedure MapNetDrive;

var

    nd:TNetResourceA;

begin

    nd.dwType:=resourcetype_disk;

    nd.lpLocalName:='x:'; //nd.lpLocalName:='x:', 'x'- буква диска

    nd.lpRemoteName:='\\nethost\sharefolder\'; //nd.lpRemoteName:='\\nethost\sharefolder\' - сетевой путь

    nd.lpProvider:=nil;

    WNetAddConnection2(nd,nil,nil),

end; //procedure

К началу

procedure CheckKey(Key: Word);

begin

   case Key of

        VK_CAPITAL:
          if GetKeyState(VK_CAPITAL) and
1 = 1 then
          
// что-нибудь делаем
           else
       
   //что-нибудь делаем
        VK_INSERT:
           if GetKeyState(VK_INSERT) and 1 = 1 then
           // что-нибудь делаем
           else
       
   //что-нибудь делаем
        VK_NUMLOCK:
           if GetKeyState(VK_NUMLOCK) and 1 = 1 then
           // что-нибудь делаем
           else
       
   //что-нибудь делаем
        VK_SCROLL:
           if GetKeyState(VK_SCROLL) and 1 = 1 then
           // что-нибудь делаем
           else
       
   //что-нибудь делаем

    end;
//case

end; //procedure

К началу

procedure GetMemStatus(var MemUse,MemPhysTotal,MemPhysFree,MemVirtTotal,MemVirtFree:string);

var
    MS: TMemoryStatus;

begin

    MS.dwLength := SizeOf(MS);
    GlobalMemoryStatus(MS);
    MemUse:=inttostr(MS.dwMemoryLoad)+
'%'; // Используется оперативной памяти в %
    MemPhysTotal:=inttostr(MS.dwTotalPhys div
1024)+' kb'; // Всего оперативной памяти в Кб
    MemPhysFree:=inttostr(MS.dwAvailPhys div
1024)+' kb'; // Свободно оперативной памяти в Кб
    MemVirtTotal:=inttostr(MS.dwTotalVirtual div
1024)+' kb'; // Всего виртуальной памяти в Кб
    MemVirtFree:=inttostr(MS.dwAvailVirtual div 1024)+' kb'; // Свободно виртуальной памяти в Кб

end; // procedure

К началу

procedure GetDirInfo(var WinDir,SysDir,CurDir:string);

var
    S: array[
0..MAX_PATH] of char;

begin

    { Возвращает путь к каталогу, где расположен Windows }
    GetWindowsDirectory(S,SizeOf(S));
    WinDir:=s;
    { Возвращает путь к системному каталогу }
    GetSystemDirectory(S,SizeOf(S));
    SysDir:=s;
    { Возвращает путь к текущему каталогу }
    GetCurrentDirectory(SizeOf(S),S);
    CurDir:=s;

end; //procedure

К началу

procedure GetCPUSpeed(var CPUSpeed:string);

const
    DelayTime =
500;

var
    TimerHi, TimerLo: DWORD;
    PriorityClass, Priority: Integer;
    Speed:Double;

begin

    PriorityClass := GetPriorityClass(GetCurrentProcess);
    Priority := GetThreadPriority(GetCurrentThread);
    SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
    SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
    Sleep(
10);
    asm
       
dw 310Fh
        mov TimerLo, eax
        mov TimerHi, edx

    end;
    Sleep(DelayTime);
    asm
        dw 310Fh
        sub eax, TimerLo
        sbb edx, TimerHi
        mov TimerLo, eax
        mov TimerHi, edx

    end;

    SetThreadPriority(GetCurrentThread, Priority);
    SetPriorityClass(GetCurrentProcess, PriorityClass);
    Speed := TimerLo / (
1000.0 * DelayTime);
    CPUSpeed:= Format(
'%f MHz', [Speed])

end; //procedure

К началу

procedure GetPrintInfo(var PrnName:string);

begin

    if Printer.Printers.Count>0 then
        PrnName:=Printer.Printers[Printer.PrinterIndex]
    else
        PrnName:=
'Нет установленных принтеров';

end;

К началу

procedure GetOSVerInfo(var Platform,OSVer,Build:string);

var
    VI: TOSVersionInfo;

begin

    VI.dwOSVersionInfoSize := SizeOf(VI);
    GetVersionEx(VI);
   case VI.dwPlatformID of
        VER_PLATFORM_WIN32S:Platform:=
'Windows 3.1x с Win32s'; // установлена ОС Windows 3.1
//c Win32
        VER_PLATFORM_WIN32_WINDOWS:Platform:=
'Windows 95/98'; // установлена ОС Windows 95    //или 98
        VER_PLATFORM_WIN32_NT:Platform:=
'Windows NT'; // установлена ОС Windows NT или 2000
    end;
//case
    OSVer:=Format(
'%d.%d', [VI.dwMajorVersion, VI.dwMinorVersion]);
    Build:=Format(
'%d', [LoWord(VI.dwBuildNumber)]);

end;//procedure

К началу

Как определить тип, букву носителя, объем и свободное место?

Добавьте в проект компоненты ListView и TButton. 

procedure TForm1.Button1Click(Sender: TObject);

begin
    CheckDrives;
end;

procedure CheckDrives;

var
    i,j,Fr,SZ: Integer;
    C: String;
    DType: Integer;
    DriveString,DriveType: String;
    Ads: TListItem;

begin
    Form1.ListView1.Items.Clear;
    j:=0;
    for i := 65 to 90 do
    begin
        j:=j+1;
        C := chr(i)+':\';
        DType := GetDriveType(PChar(C));
        case DType of
            0: DriveString := C+' Невозможно определить тип диска';
            1: DriveString := C+' Неправильно задан путь к диску';
            DRIVE_REMOVABLE:
            begin
                DriveString :=' '+C;
// съемный диск (дисковод)
                DriveType:=' cъемный';
           end;
            DRIVE_FIXED:
// жесткий диск
            begin
                DriveString :=' '+C;
                DriveType:=' жесткий';
            end;
            DRIVE_REMOTE:
// сетевой диск
            begin
                DriveString :=' '+C;
                DriveType:=' cетевой';
            end;
            DRIVE_CDROM: // CD-ROM
            begin
                DriveString :=' '+C;
                DriveType:=' CD ROM';
            end;
            DRIVE_RAMDISK: // RAM диск
            begin
                DriveString :=' '+C;
                DriveType:=' RAM диск';
            end;
        end;
    if not ((DType = 0) or (DType = 1)) then
    begin
        FR:=DiskFree(j); //свободное место
        SZ:=DiskSize(j); // емкость носителя
        Ads:=Form1.ListView1.Items.Add ;
        Ads.Caption:=(DriveString);
        Ads.SubItems.Add('type');
        Ads.SubItems.Strings[0]:=DriveType;
        Ads.SubItems.Add('size');
        Ads.SubItems.Strings[1]:=Inttostr(SZ div (1024*1024));
        Ads.SubItems.Add('free');
        Ads.SubItems.Strings[2]:=Inttostr(FR div (1024*1024));

    end; //case

  end; //for

end; //procedure

 

Поместите в раздел protected описание процедуры WMGetSysCommand:

protected
    procedure WMGetSysCommand(var Messag: TMessage );message WM_SYSCOMMAND;

а в разделе implementation поместите тело процедуры:

procedure TForm1.WMGetSysCommand(var Messag: TMessage );

begin

    if (Messag.wParam= SC_CLOSE) then
    begin
        // что-нибудь делаем
    end
    else
    inherited;
// обработчик по умолчанию

end; //procedure

 

Поместите в раздел private описание процедуры WMHotKey:

private

    procedure WMHotKey(var Msg : TWMHotKey); message WM_HOTKEY;

в разделе глобальных переменных создадим переменную:

HK_ID : ATOM;

В обработчик создания окна поместите след код:

procedure TForm1.FormCreate(Sender: TObject);

begin

    idrsh:=GlobalAddAtom('HK_ID'); // создаем уникальный идентификатор "горячей" клавиши

    RegisterHotKey(Form1.Handle,HK_ID,mod_alt,78);// регистрируем ее в системе

// 3-й параметр функции RegisterHotKey показывает на наличие клавиш Alt,Control или Shift

// 4-й параметр - числовое значение клавиши 

end; //procedure

// в обработчике закрытия формы снимаем регистрацию

procedure TForm1.FormDestroy(Sender: TObject);

begin
    UnRegisterHotKey(Form1.Handle,HK_ID);
end;
//procedure

 

// обработчик нажатия "горячей" клавиши

procedure TForm1.WMHotKey (var Msg : TWMHotKey);

begin

    if Msg.HotKey = HK_ID then       

    // что-нибудь делаем

end; //procedure


Принимаются любые предложения по хостингу!

[Главная]  [Вести с полей]  [Железо]  [Софт]  [Программирование]  [Сетевуха]  [Гостевая]  [Книжки]  [Форум]  [Ссылки]  [Новости] [Игрища] [ОэСки]  [О нас]

Пишите письма! -> Письмо

Дата создания сайта 23.01.2001 г. последние изменения 02.03.01 19:14

Используются технологии uCoz