Q&A

  • 특정경로의 어플리케이션이 실행되고 있는지 감지하려면???
안녕하세요~ ^^

궁금한게 있어서요... 좀 간단해 보일수도 있는데요....제가 무식하걸랑요 ㅡ.ㅡ;;

제가 알고 싶은건요...특정경로의 어플리케이션이 실행되고 있는지 알수 있는 방법이 없을까 해서요... 예를 들면 C:exedel.exe 이게 실행되고 있은지 어떻게 알수 없을까요?? 좀 가르쳐주세엽...^^;; 부탁드립니다~

3  COMMENTS
  • Profile
    최용일 2001.05.31 02:42
    안녕하세요. 최용일입니다...



    좀 간단한게 아니군요...



    먼저 현재 실행되고 있는 윈도우들의 목록을 구해야 겠죠... 이건 EnumWindows라는 API함수로 간단히 할 수 있는데...여기에서 얻어진 핸들로 실행파일 이름을 구해야 하는데 이건 9x계열하고 NT계열하고 구하는 방식이 약간 다릅니다...



    윈도우의 플랫폼을 알수 있는 함수는 팁란에 있으니까 그건 생략하구요... 아래와 같이 하세요... uses절에 TLHelp32유닛을 추가하세요... NT계열일 경우는 TLHelp32대신에 PSApi유닛을 추가하시구요...



    function GetWindowFileName9x(Handle: THandle): string;

    // 윈도우 플랫폼이 Windows 9x계열일 경우

    var

    ProcessID: DWORD;

    SnapShot: THandle;

    ProcessEntry: TProcessEntry32;

    begin

    Result := '';

    GetWindowThreadProcessID(Handle, @ProcessID);

    SnapShot := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);

    ProcessEntry.dwSize := SizeOf(ProcessEntry);

    if (SnapShot <> THandle(-1)) then

    begin

    if Process32First(SnapShot, ProcessEntry) then

    begin

    repeat

    if (ProcessID = ProcessEntry.th32ProcessID) then

    begin

    Result := string(ProcessEntry.szEXEFile);

    Break;

    end;

    until (Process32Next(SnapShot, ProcessEntry) = False);

    end;

    end;

    CloseHandle(SnapShot);

    end;



    function GetWindowFileNameNT(Handle: THandle): string;

    // 플랫폼이 NT계열일경우

    var

    ProcessID: DWORD;

    ProcessHandle: THandle;

    FileName: array [0..Max_Path - 1] of char;

    begin

    Result := '';

    GetWindowThreadProcessID(Handle, @ProcessID);

    ProcessHandle := OpenProcess(Process_Query_Information or Process_VM_Read, False, ProcessID);

    if ProcessHandle <> 0 then

    begin

    if GetModuleBaseName(ProcessHandle, 0, FileName, SizeOf(FileName)) > 0 then

    Result := FileName;

    CloseHandle(ProcessHandle);

    end;

    end;



    function EnumWindowsProc(Wnd: HWND; SearchFileName: PChar): BOOL; stdcall;

    // EnumWindows 콜백함수

    var

    FileName: string;

    begin

    Result := True;

    FileName := GetWindowFileName9x(Wnd);

    // NT계열일경우: FileName := GetWindowFileNameNT(Wnd);



    if CompareText(FileName, SearchFileName) = 0 then

    // 찾고자 하는 파일이름과 같은가 검색

    Result := False;

    end;



    // Button1의 OnClick이벤트

    procedure TForm1.Button1Click(Sender: TObject);

    var

    SearchName: PChar;

    begin

    SearchName := 'C:exedel.exe';

    if not EnumWindows(@EnumWindowsProc, Integer(SearchName)) then

    ShowMessage('C:exedel.exe파일이 현재 실행중입니다.')

    else

    ShowMessage('C:exedel.exe파일이 현재 실행중이지 않습니다.');

    end;



    ^^ 항상 즐코하세요...



    왕초보? wrote:

    > 안녕하세요~ ^^

    > 궁금한게 있어서요... 좀 간단해 보일수도 있는데요....제가 무식하걸랑요 ㅡ.ㅡ;;

    > 제가 알고 싶은건요...특정경로의 어플리케이션이 실행되고 있는지 알수 있는 방법이 없을까 해서요... 예를 들면 C:exedel.exe 이게 실행되고 있은지 어떻게 알수 없을까요?? 좀 가르쳐주세엽...^^;; 부탁드립니다~

  • Profile
    왕초보? 2001.05.31 21:12
    감사합니다... 그런데여... 윈9X계열일 경우의 것을 해봤는데여...제가 무식해서 그런건지 안되네여 ㅡ.ㅡ 어느 부분이냐면요...

    변수선언에서 ProcessEntry: TProcessEntry32; <==요부분이 걸리네여.. 다시 한번 갈쳐주셨음 해여...부탁드려여~ ^^;;;

  • Profile
    최용일 2001.05.31 22:07
    제글을 잘 읽어보시면 되는데.... 쩝~



    uses 절에 TLHelp32유닛을 추가하세요... 아래처럼...



    uses

    ......, TLHelp32;



    왕초보? wrote:

    > 감사합니다... 그런데여... 윈9X계열일 경우의 것을 해봤는데여...제가 무식해서 그런건지 안되네여 ㅡ.ㅡ 어느 부분이냐면요...

    > 변수선언에서 ProcessEntry: TProcessEntry32; <==요부분이 걸리네여.. 다시 한번 갈쳐주셨음 해여...부탁드려여~ ^^;;;