Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[7320] [답변] KNK300/ 현재 실행 되고 있는 프로그램 알기
dashform [ ] 849 읽음    2000-08-03 16:58
안녕하세요 좋은생각 입니다.

시스탬안에서 특정 메인 윈도우를 찾고자 할 때,  EnumWindows API함수를 사용하면 됩니다.
열거(enumeration)함수는 Windows에 독특하게 있는 함수 인데,
왜냐하면 일반적으로 다른 함수를 그 파라미처로 취하기 때문이져.
이러한 열거 함수를 함수의 포인터(종종 콜백(callback)함수라고도 한다.)를
파라미처로 요구하게 됩니다.

현재 이 태스트 프로그램에서는 같은 프로그램이 여러개 떠있는경우는 처리가 안되어 있는데요...
아래 윈도우를 찾는 조건에서 윈도우 헨들로 모듈 파일이름과 일치하는 다른 윈도우가 있다면
하나만 추가하는 내용이 빠져 있습과...급히 태스트 프로그램을 만드는 바람에...추가 하시구여...


여기서 EnumWndProc를 sdtcall로 선언해야만 되느데, 이것은 다른 함수의 포인터로서 된다는거구
그다음에는 시스템에 의해 호출되기 때문이져
Windows은 파스칼 코드에서 sdtcall로 표시해 놓은 함수들만을 적절히 호출할 수 있는데,
이것은 시스탬은 디폴트의 register델파이 호출규약을 이해하지 못하기 때문입니다.

이예제 프로그램으로 뭐 대충...현 데스크탑위의 거의 모든 프로그램정보를 구할 수 있는 예제가
될수도 있을 것같네영...
그럼...얼렁뚱땅 예제를...보세여.//
폼에는 버튼과 리스트 박스만 놓았습니당...

type
  PHWND = ^HWND;
  PFrom1 = ^TForm1;

function EnumWndProc(Hwnd : THandle; MyWindow : PHWND) : BOOL; stdcall;
var
  ClassName, ModuleName, WinModuleName, WinCaption : string;
  WinInstance : THandle;
  FromPtr : PFrom1;
begin
  Result := True;
  // 윈도우 형태가 아니거나 에 보이지 않는 원도우는 제외 한다.
  if IsWindow(Hwnd) and IsWindowVisible(Hwnd) then begin
    SetLength(ClassName, 100);
    SetLength(WinCaption, 100);
    GetClassName(Hwnd, PChar(ClassName), Length(ClassName));
    GetWindowText(Hwnd, Pchar(WinCaption), Length(WinCaption));
    WinInstance := GetWindowLong(Hwnd, GWL_HINSTANCE);
    GetModuleFileName(WinInstance, PChar(WinModuleName), Length(WinModuleName));

    // 열거할 윈도우의 조건을 명시한다.
    if (Trim(WinCaption) <> '') and             // Title없는 것은 제외
       //((ClassName) <> 'TForm1') and          // 자신(ClassFind)은 제외
       ((ClassName) <> 'TApplication') and      // Delphi의 TApplication제외
       //(ModuleName = WinModuleName) and        // 같은 모듈은 제외...이건 좀..생각을
       ((ClassName) <> 'Progman') then begin    // 윈도우 프로그램 매니져 제외
      SetLength(WinModuleName, 200);
      FromPtr := PFrom1(MyWindow);
      FromPtr^.ListBox1.Items.Add('--------------------------------------------------------');
      FromPtr^.ListBox1.Items.Add(WinCaption);
      FromPtr^.ListBox1.Items.Add(ClassName);
      FromPtr^.ListBox1.Items.Add(WinModuleName);
      FromPtr^.ListBox1.Items.Add('--------------------------------------------------------');
    end;
  end;
end;

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

                                                   꿈을 가진 소년 /좋/은/생/각/


+ -

관련 글 리스트
7320 [답변] KNK300/ 현재 실행 되고 있는 프로그램 알기 dashform 849 2000/08/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.