특정경로의 어플리케이션이 실행되고 있는지 감지

From YYpBD's MediaWiki

Jump to: navigation, search


Re: 특정경로의 어플리케이션이 실행되고 있는지 감지하려면???  
안녕하세요. 최용일입니다...

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

먼저 현재 실행되고 있는 윈도우들의 목록을 구해야 겠죠... 이건 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:\exe\del.exe';
   if not EnumWindows(@EnumWindowsProc, Integer(SearchName)) then
       ShowMessage('C:\exe\del.exe파일이 현재 실행중입니다.')
   else
       ShowMessage('C:\exe\del.exe파일이 현재 실행중이지 않습니다.');
end;

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



맞춤검색