ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • API 테크닉들1
    정리필요2 2008. 8. 15. 16:04

    출처 : http://cafe.naver.com/delphian/52

    윈도우 캡션 깜박이게 하기
    윈도우 디렉토리 알아내기
    비퍼 ON/OFF 시키기
    시스템 가동방법 알아내기
    마우스버튼 역할바꾸기
    스크린세이버 ON/OFF시키기
    마우스버튼 개수 알아내기
    WIN.INI파일에 문자열쓰기
    WIN.INI파일에서 문자열읽어오기
    INI파일에 문자열쓰기
    특정 INI파일에서 문자열읽어오기
    현재 실행중인 OS버전 알아내기
    윈도우 배경화면바꾸기
     CPU종류 알아내기
    메모리상태 알아내기
    OEM 코드페이지 알아내기
    토글키 상태알아내기
    윈도우즈 가동시간알아내기
    날짜정보 리셋하기
    윈도우즈 종료시키기
    환경변수 알아내기
    디스크 볼륨정보 알아내기
    현재 작업디렉토리 알아내기/지정하기
    해상도 알아내기
    프로그램종료 방지하기(10/13/98)
    실행중인 Application List알아내기(10/13/98)
     

    --------------------------------------------------------------------------------
     윈도우 캡션 깜박이게 하기 
    procedure TForm1.FormActivate(Sender: TObject);
    begin
    Timer1.Enabled := True;
    end;

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    FlashWindow(Form1.Handle, True);
    end;


    BOOL FlashWindow(
    HWND hWnd, //폼의 Handle속성을 지정
    BOOL bInvert //윈도우즈 95에서는 이 변수값을 무시하며,
    //True로 지정된 경우 타이틀바가 활성/비활성 상태가 토글된다
    );
     

    --------------------------------------------------------------------------------
    윈도우 디렉토리 알아내기 
    procedure TForm1.Button1Click(Sender: TObject);
    var
    Windir : array[0..30] of char;
    begin
    GetWindowsDirectory(Windir,sizeof(windir));
    Label1.Caption := Windir;
    end;
     
    UNIT GetWindowDirectory(
    LPTSTR lpBuffer, //시스템 디렉토리를 저장할 버퍼의 포인터
    UINT uSize //디렉토리 버퍼의 크기
    );


    --------------------------------------------------------------------------------
    비퍼 ON/OFF 시키기
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    SystemParametersInfo(SPI_SETBEEP, 1, Pchar(0), 0); //Beeper ON
    Label1.Caption := 'Beep On';
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    SystemParametersInfo(SPI_SETBEEP, 0, Pchar(0), 0); //Beeper OFF
    Label1.Caption := 'Beep Off';
     
    end;
     
    procedure TForm1.Button3Click(Sender: TObject);
    begin
    MessageBeep(MB_OK);
    end;
     
    BOOL SystemParametersInfo(
    UINT uiAction, //조회하거나 변경할 시스템 파라미터변수
    UINT uiParam, //시스템 파라미터 변수에 따라 지정
    PVOID pvParam, //시스템 파라미터 변수에 따라 지정
    UINT fWinini //시스템 파라미터 변수의 내용이 변경될 경우
    //사용자프로파일의 변경여부를 지정
    );

    BOOL MessageBeep(
    UINT uType
    );
     

    --------------------------------------------------------------------------------
     시스템 가동방법 알아내기 
    procedure TForm1.Button1Click(Sender: TObject);
    var
    boot : integer;
    begin
    boot := GetSystemMetrics(SM_CLEANBOOT);
    case boot of
    0 : Label1.Caption := 'Normal Boot';
    1 : Label1.Caption := 'Fail-safe Boot';
    2 : Label1.Caption := 'Fail-safe with Network Boot';
    end;
    end;
     
    int GetSystemMetrics(
    int nIndex //시스템에서 사용하는 정보에대한 변수값
    );
     

    --------------------------------------------------------------------------------
     마우스버튼 역할바꾸기
    procedure TForm1.Button1Click(Sender : TObject);
    begin
    SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, 1, PChar(0), 0);
    Label1.Caption := 'Left : Popup Right : Pointing and Execute';
    end;
     
    procedure TForm1.Button2Click(Sender : TObject);
    begin
    SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, 0, PChar(0), 0);
    Label1.Caption := 'Left : Pointing and Execute Right : Popup';
    end;
     
    BOOL SystemParametersInfo(
    UINT uiAction, //조회하거나 변경할 시스템 파라미터변수
    UINT uiParam, //시스템 파라미터 변수에 따라 지정
    PVOID pvParam, //시스템 파라미터 변수에 따라 지정
    UINT fWinini //시스템 파라미터 변수의 내용이 변경될 경우
    //사용자프로파일의 변경여부를 지정
    );
     
    BOOL MessageBeep(
    UINT uType
    );
     

    --------------------------------------------------------------------------------
     스크린세이버 ON/OFF시키기
    procedure TForm1.Button1Click(Sender : TObject);
    begin
    SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, PChar(0), 0);
    Label1.Caption := 'SCREEN SAVER ON';
    end;
     
    procedure TForm1.Button1Click(Sender : TObject);
    begin
    SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0, PChar(0), 0);
    Label1.Caption := 'SCREEN SAVER OFF';
    end;
     
    BOOL SystemParametersInfo(
    UINT uiAction, //조회하거나 변경할 시스템 파라미터변수
    UINT uiParam, //시스템 파라미터 변수에 따라 지정
    PVOID pvParam, //시스템 파라미터 변수에 따라 지정
    UINT fWinini //시스템 파라미터 변수의 내용이 변경될 경우
    //사용자프로파일의 변경여부를 지정
    );
     
    BOOL MessageBeep(
    UINT uType
    );
     

    --------------------------------------------------------------------------------
     마우스버튼 개수 알아내기
    procedure TForm1.Button1Click(Sender: TObject);
    var
    ButtonNo : integer;
    begin
    ButtonNo := GetSystemMetrics(SM_CMOUSEBUTTONS);
    Label1.Caption := IntToStr(ButtonNo)+'개입니다';
    end;
     
    int GetSystemMetrics(
    int nIndex //시스템에서 사용하는 정보에대한 변수값
    );
     

    --------------------------------------------------------------------------------
     WIN.INI파일에 문자열쓰기
    procedure TForm1.Button1Click(Sender : TObject);
    begin
    WriteProfileString(Edit1.Text, Edit2.Text, Edit3.Text);
    // Win.ini 파일에 Edit 컴포넌트에 입력된 문자열을 출력한다.
    end;
     
    BOOL WriteProfileString(
    LPCTSTR lpszSection, //Win.ini파일 Section명
    LPCTSTR lpszKey, //Section에 출력할 Key명
    LPCTSTR lpszString //Key에 할당할 문자열
    };
     
    // INI파일의 Section, Key, String의 구성형태
    // [Section]
    // Key = String;
     

    --------------------------------------------------------------------------------
     WIN.INI파일에서 문자열읽어오기
    procedure TForm1.Button1Click(Sender : TObject);
    var
    retstr : string;
    begin
    GetProfileString(Edit1.Text, Edit2.Text, Edit3.Text, retstr,sizeof(retstr));
    Label1.Caption := retstr;
    end;
     
    DWORD GetProfileString(
    LPCTSTR lpAppName, //Win.ini파일 Section명
    LPCTSTR lpKeyName, //Section에 포함되어 있는 Key명
    LPCTSTR lpDefault, //함수에러 발생시 되돌려지는 문자열
    LPCTSTR lpReturnedString, //Key에 할당되어 있는 문자열을 읽어오는 문자열의 버퍼의 포인터
    DWORD nSize //문자열 버퍼의 크기
    );
     

    --------------------------------------------------------------------------------
     INI파일에 문자열쓰기
    procedure TForm1.Button1Click(Sender : TObject);
    begin
    WritePrivateProfileString(Edit1.Text, Edit2.Text, Edit3.Text, Edit4.Text);
    //Edit4에서 지정한 파일에 각 Edit컴포넌트에 입력된 문자열을 출력한다.
    //출력하고자 하는 파일이 없을 경우 새로 만든다.
    end;
     
    BOOL WritePrivateProfileString(
    LPCTSTR lpszSection, //INI파일 Section명
    LPCTSTR lpszKey, //Section에 출력할 Key명
    LPCTSTR lpszString, //Key에 할당할 문자열
    LPCTSTR lpszFile //문자열을 출력할 INI파일명으로 확장자까지 입력해야한다.
    );
     

    --------------------------------------------------------------------------------
     특정 INI파일에서 문자열읽어오기
    procedure TForm1.Button1Click(Sender : TObject);
    var
    retstr : string;
    begin
    GetPrivateProfileString(Edit1.Text, Edit2.Text, Edit3.Text, retstr,sizeof(retstr),Edit4.Text);
    //특정 INI파일의 지정한 Section 및 Key에 할당된 문자열을 읽어온다.
    //GetPrivateProfileString함수에 지정한 Section이나 Key가 없을 경우
    //Default String을 되돌린다.
    Label1.Caption := retstr;
    end;
     
    DWORD GetPrivateProfileString(
    LPCTSTR lpAppName, //특정 INI파일 Section명
    LPCTSTR lpKeyName, //Section에 포함되어 있는 Key명
    LPCTSTR lpDefault, //함수에러 발생시 되돌려지는 문자열
    LPTSTR lpReturnedString, //Key에 할당되어 있는 문자열을 읽어오는 문자열버퍼의 포인터
    DWORD nSize, //문자열버퍼의 크기
    LPCTSTR lpFileName // INI파일명으로 확장자까지 입력해야한다.
    );
     

    --------------------------------------------------------------------------------
     현재 실행중인 OS버전 알아내기
    procedure TForm1.Button1Click(Sender : TObject);
    var
    Version : LongInt;
    begin
    Version := GetVersion;
    Label1.Caption := 'Windows ' + IntToStr(LoByte(LoWord(Version))) + '.' +
    IntToStr(HiByte(LoWord(Version)));
    Label2.Caption := 'DOS ' + IntToStr(HiByte(HiWord(Version))) + '.' +
    IntToStr(LoByte(HiWord(Version)));
    end;
     
    DWORD GetVersion(VOID)
     
    Platform High order bit Low order byte (major version number)
    Windows NT zero 3 or 4
    Windows 95 1 4
    Win32s with Windows 3.1 1 3
     

    --------------------------------------------------------------------------------
     윈도우 배경화면바꾸기
    procedure ChangeBatang;
    var
    Reg : TRegIniFile;
    begin
    Reg := TRegIniFile.Create('Control Panel');
    Reg.WriteString('desktop','Wallpaper','c:\babo.bmp');
    // 바탕화면으로 c:\babo.bmp를 사용함.
    Reg.WriteString('desktop','TitleWallpaper','1');
    Reg.Free;
     
    SystemParametersInfo(SPI_SETDESKWALLPAPER, 0,
    nil, SPIF_SENDWININICHANGE);
    end;
     
    BOOL SystemParametersInfo(
    UINT uiAction, // system parameter to query or set
    UINT uiParam, // depends on action to be taken
    PVOID pvParam, // depends on action to be taken
    UINT fWinIni // user profile update flag
    );
     

    --------------------------------------------------------------------------------
     CPU종류 알아내기
    procedure TForm1.Button1Click(Sender: TObject);
    var
    Sysinfo : TSysteminfo;
    begin
    GetSystemInfo(Sysinfo);
    case Sysinfo.dwProcessorType of
    386 : Label1.Caption := 'Intel 386 ';
    486 : Label1.Caption := 'Intel 486 ';
    586 : Label1.Caption := 'Intel Pentium';
    4000 : Label1.Caption := 'MIPS R4000';
    21046 : Label1.Caption := 'Alpha 21046'
    end;
    end;
     
    VOID GetSystemInfo(
     
    LPSYSTEM_INFO lpSystemInfo // address of system information structure
    );
     
     
    // SYSTEM_INFO 구조체 내용 - 자세한 사항은 도움말 참조
    typedef struct _SYSTEM_INFO { // sinf
    union {
    DWORD dwOemId;
    struct {
    WORD wProcessorArchitecture;
    WORD wReserved;
    };
    };
    DWORD dwPageSize;
    LPVOID lpMinimumApplicationAddress;
    LPVOID lpMaximumApplicationAddress;
    DWORD dwActiveProcessorMask;
    DWORD dwNumberOfProcessors;
    DWORD dwProcessorType;
    DWORD dwAllocationGranularity;
    WORD wProcessorLevel;
    WORD wProcessorRevision;
     
    } SYSTEM_INFO;
     

    --------------------------------------------------------------------------------
     메모리상태 알아내기
    procedure TForm1.Button1Click(Sender : TObject);
    var
    MemStat : TMemoryStatus;
    begin
    MemStat.dwLength := sizeof(TMemoryStatus);
    GlobalMemoryStatus(MemStat);
    with MemStat do
    begin
    Label1.Caption := Format('%d KB',[Trunc(dwTotalPhys/1024)]); //총메모리
    Label2.Caption := Format('%d KB',[Trunc(dwAvailPhys/1024)]); //MemAvailable
    Label3.Caption := Format('%d %%',[trunc(dwAvailPhys/dwTotalPhys*100)]); //사용메모리
    Label4.Caption := Format('%d KB',[Trunc(dwTotalPageFile/1024)]); //SwapFileSetting
    Label5.Caption := Format('%d KB',[Trunc((dwTotalPageFile-dwAvailPageFile)/1024)]); //SwapFileSize
    Label6.Caption := Format('%d %%',[100-trunc(dwAvailPageFile/dwTotalPageFile*100)]); //SwapFileUsage
    end;
     
    BOOL GetDiskFreeSpace(
    LPCTSTR lpRootPathName, // 디스크 루트 패스
    LPDWORD lpSectorsPerCluster, // 클러스터당 섹터수
    LPDWORD lpBytesPerSector, // 섹터당 바이트수
    LPDWORD lpNumberOfFreeClusters, // 사용하지 않은 클러스터수
    LPDWORD lpTotalNumberOfClusters // 총 클러스터수
    );
     

    --------------------------------------------------------------------------------
     OEM 코드페이지 알아내기
    procedure TForm1.Button1Click(Sender : TObject);
    var
    ret : integer;
    begin
    ret := GetOEMCP;
    case ret of
    437 : Label1.Caption := 'MS_DOS United States(CP 437)';
    //리턴값은 아래 설명 참조
    // .....
    default : Label1.Caption := 'Etc';
    end;
    end;
     
    UINT GetOEMCP(VOID);
    // OEM 코드값 리턴
     
    437 MS-DOS United States
    708 Arabic (ASMO 708)
    709 Arabic (ASMO 449+, BCON V4)
    710 Arabic (Transparent Arabic)
    720 Arabic (Transparent ASMO)
    737 Greek (formerly 437G)
    775 Baltic
    850 MS-DOS Multilingual (Latin I)
    852 MS-DOS Slavic (Latin II)
    855 IBM Cyrillic (primarily Russian)
    857 IBM Turkish
    860 MS-DOS Portuguese
    861 MS-DOS Icelandic
    862 Hebrew
    863 MS-DOS Canadian-French
    864 Arabic
    865 MS-DOS Nordic
    866 MS-DOS Russian (former USSR)
    869 IBM Modern Greek
    874 Thai
    932 Japan
    936 Chinese (PRC, Singapore)
    949 Korean
    950 Chinese (Taiwan, Hong Kong)
    1361 Korean (Johab)
     

    --------------------------------------------------------------------------------
     토글키 상태알아내기
    procedure TForm1.Button1Click(Sender : TObjcet);
    begin
    if GetKeyState(VK_INSERT) = 1 then
    Label1.Caption := 'ON'
    else
    Label1.Caption := 'OFF';
    //Insert 키가 눌려졌으면 1, 아니면 0을 리턴
    //다른 토글키도 마찬가지
    end;
     
    SHORT GetKeyState(
    int nVirtKey // 가상키 코드
    );
     
    //키값
    VK_CAPITAL Caps Lock키
    VK_NUMLOCK Num Lock키
    VK_SCROLL Scroll Lock키
     

    --------------------------------------------------------------------------------
     윈도우즈 가동시간알아내기
    procedure TForm1.Button1Click(Sender : TObject);
    var
    hh, mm, ss : integer;
    ret : LongInt;
    buff : string;
    begin
    ret := GetTickCount/1000;
    hh := ret/3600; //시간계산
     
    ret := ret -(3600*hh);
    mm := ret/60 //분 계산
     
    ret := ret - (60*mm);
    ss := ret; //초 계산
     
    strcpy(buff,IntToStr(hh)+'시간 '+IntToStr(mm)+'분 '+IntToStr(ss'+초');
    Label1.Caption := buff;
    end;
     

    --------------------------------------------------------------------------------
     날짜정보 리셋하기
    procedure TForm1.Button1Click(Sender: TObject);
    var
    s_time : TSystemTime;
    begin
    s_time.wYear := StrToInt(Edit1.Text);
    s_time.wMonth := StrToInt(Edit2.Text);
    s_time.wDay := StrToInt(Edit3.Text);
    SetSystemTime(s_time);
     
    Label1.Caption := DateToStr(Now);
    end;
     
    BOOL SetSystemTime(
     
    CONST SYSTEMTIME *lpSystemTime // address of system time to set
    );
     
    // SYSTEMTIME 구조체
    typedef struct _SYSTEMTIME {
    WORD wYear;
    WORD wMonth;
    WORD wDayOfWeek;
    WORD wDay;
    WORD wHour;
    WORD wMinute;
    WORD wSecond;
    WORD wMilliseconds;
    } SYSTEMTIME;
     

    --------------------------------------------------------------------------------
     윈도우즈 종료시키기
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    case RadioGroup1.ItemIndex of
    0 : ExitWindowsEx(EWX_FORCE, 0); //강제종료
    1 : ExitWindowsEx(EWX_LOGOFF, 0); //LOG OFF
    2 : ExitWindowsEx(EWX_POWEROFF,0); //Shut Down & Turn Off
    3 : ExitWindowsEx(EWX_REBOOT, 0); //Shut Down & Reboot
    4 : ExitWindowsEx(EWX_SHUTDOWN, 0); //ShutsDown
    end;
    end;
     
    BOOL ExitWindowsEx(
    UINT uFlags, // shutdown operation
    DWORD dwReserved // reserved
    );
     

    --------------------------------------------------------------------------------
     환경변수 알아내기
    procedure TForm1.Button1Click(Sender: TObject);
    var
    Dosenv : Pchar;
    len, i : Integer;
    begin
    Dosenv := GetEnvironmentStrings;
     
    while Dosenv <> '\0' do
    begin
    len := StrLen(Dosenv);
    if (len = 0) then break
    else begin
    Memo1.Lines.Add(Dosenv);
    for i := 0 to len do
    Inc(Dosenv);
    end;
    end;
    end;
     
    LPVOID GetEnvironmentStrings(VOID)
    //환경변수에 대한 문자포인터를 리턴
     

    --------------------------------------------------------------------------------
     디스크 볼륨정보 알아내기
    procedure TForm1.Button1Click(Sender: TObject);
    var
    RPName : Pchar;
    VolBuf : Pchar;
    VolSNum : Longint;
    MaxLen : Longint;
    FileFlags : Longint;
    FileNameBuf : Pchar;
    begin
    GetVolumeInformation(RPName, VolBuf, sizeof(VolBuf), VolSNum, MaxLen,
    FileFlags, FileNameBuf, sizeof(FileNameBuf));
     
    Label1.Caption := RPName;
    Label2.Caption := VolBuf;
    Label3.Caption := IntToStr(VolSNum);
    Label4.Caption := IntToStr(MaxLen);
     
    end;
     
    BOOL GetVolumeInformation(
     
    LPCTSTR lpRootPathName, // 디스크 루트 패스
    LPTSTR lpVolumeNameBuffer, // 볼륨이름에 대한 버퍼 포인터
    DWORD nVolumeNameSize, // 볼륨이름 버퍼 크기
    LPDWORD lpVolumeSerialNumber, // 시리얼 넘버
    LPDWORD lpMaximumComponentLength, // 지정 가능한 파일이름의 최대길이
    LPDWORD lpFileSystemFlags, // 파일시스템 플래그
    LPTSTR lpFileSystemNameBuffer, // 파일시스템 네임버퍼 포인터
    DWORD nFileSystemNameSize // 파일시스템 네임버퍼 크기
    );
     

    --------------------------------------------------------------------------------
     현재 작업디렉토리 알아내기/지정하기
    procedure TForm1.Button1Click(Sender: TObject);
    var
    CurrDir : array[0..200] of char;
    begin
    GetCurrentDirectory(sizeof(CurrDir), CurrDir);
    //현재 지정된 디렉토리를 알아낸다.
    Label1.Caption := CurrDir;
     
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    SetCurrentDirectory(Pchar(Edit1.Text));
    //새로운 디렉토리를 지정한다.
    end;
     
    DWORD GetCurrentDirectory(
    DWORD nBufferLength, // 디렉토리 버퍼의 크기
    LPTSTR lpBuffer // 디렉토리 버퍼에 대한 포인터
    );
     
    BOOL SetCurrentDirectory(
    LPCTSTR lpPathName // 새로운 현재 디렉토리명
    );
     


    --------------------------------------------------------------------------------

     해상도 알아내기
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    Label1.Caption := IntToStr(GetSystemMetrics(SM_CXSCREEN)) +
    '*' + IntToStr(GetSystemMetrics(SM_CYSCREEN));
    end;
     

    --------------------------------------------------------------------------------
     프로그램종료 방지하기

    private
        procedure WMClose(var Msg : TWMClose); message WM_CLOSE;
     public

     end;

     var
       Form1: TForm1;
       CloseDown : Boolean;

     implementation

     {$R *.DFM}

     procedure TForm1.WMClose(var Msg : TWMClose);
     begin
        if NOT CloseDown then
           Msg.Result := 0
        else
           inherited;
     end;
     
    CloseDown의 상태를 True, False로 조정함으로써
    종료를 방지, 허가할 수 있다. 

    --------------------------------------------------------------------------------
     실행중인 Application List알아내기

    function EnumWinProc(Wnd: HWND; frm: TForm1) : Boolean;
                      Export;{$IFDEF Win32}stdCall;{$ENDIF}
    var
       WinText : Array[0..255] of Char;
    begin
       GetWindowText(Wnd, WinText, 255);
       Result := True;
       if (StrPas(WinText) <> '') then
          frm.ListBox1.Items.Add(StrPas(WinText));
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
       EnumWindows(@EnumwinProc, Longint(self));
    end;
     

    --------------------------------------------------------------------------------

Designed by Tistory.