Q&A

  • 폼이 포커스를 얻었는지 잃었는지 알아내는 방법좀 알려주세요
매일 찾아서 보기만 하다가 글을 올리는건 첨이네요 ^^
포커스를 잃은 상태에서 어떤 문자를 받았을경우 깜빡거리는걸
구현하려고 하는데요.

포커스를 받았을때 발생하는 이벤트는 onEnter 이고
잃었을때 발생하는 이벤트는 onExit 라는건 알겠는데요

메인폼이 포커스를 잃었을경우와 얻었을 경우를 알아내려면
어떻게 해야하는거죠 ?
사이트 돌아다녀봤는데 모르겠습니다.

예제를 쓰셔두 그다지 길지 않을거 같은데..
가능하면 간단하게 예를 들어주셨으면 감사하겠습니다 ^^
5  COMMENTS
  • Profile
    이중철 2004.12.18 03:16
    1. 프로그램의 메인폼 알기
      Application.MainForm
    2. 활성화된 폼 찾기
      Screen.ActiveForm

    위 두가지를 사용하시면 되는데 문제는 활성화된폼이 바뀔때도
    감지하고픈것 같네요
    이경우
    Screen.OnActiveFormChange 이벤트가 있습니다.

    예를 들께요

    type
      TForm1 = class(TForm)
        .....
        Procedure OnChangeForm(Sender : TObject);
      end;


    ......
    implementation
    ......

    Procedure TForm1.OnChangeForm(Sender : TObject);
    begin
      if Screen.ActiveForm = Application.MainForm then
        caption := '1111'
      else
        caption := '2222';
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
        Screen.OnActiveFormChange := OnChangeForm;
    end;


    쉽죠 ^^

  • Profile
    전경수 2004.12.18 03:43
    예제까지 써서 해주셔서 감사하구요 ^^
    호.. 어떻게 작동하는지 보느라 시간좀 걸렸네요 ^^;;
    근데 이건 하나의 프로그램에서 서브 폼에 포커스가 갔을때만
    알게 되는거 같은데 맞나요.. ?

    제가 하고 싶은건 윈도우 전체에서의 활성폼을 알아내는건데.
    혹시 그것두 알수 있을까요 ? ^^;
    메신저 처럼 기능을 하려고 하는데

    메신저 말고 다른 프로그램을 보고 있을때 쪽지가 오면
    깜빡거리는걸 하려고 하는거거든요.



  • Profile
    이중철 2004.12.18 04:26
    깜박거리는 것이 메신저 인가요 아니면 다른 프로그램인가요
    만약 두번째 다른프로그램일경우
    다른Application을 조작하고 핸들링하는것이므로 매우
    위험하고 권하고픈 방법이 아닙니다.
    일단 방법은 전역 훅킹 하셔야 합니다.
    즉, Spy와 같은 프로그램을 만드셔야 합니다.
    그리고 첫번째는 활성화 논재와 관련이 없고 그냥 메시지 들어오면
    Activate(이러면 포커스가 가는 문제가 있음)하거나 Windowpos를
    조정하시거나 위의것과 함께 깜박거리게 할 수 있게죠



  • Profile
    전경수 2004.12.18 04:49
    정성껏 답해주셔서 고마워요 ^^
    조금 찾아서 하면 될것 같네요 ^ㅡ^


  • Profile
    구창민 2004.12.19 03:02
    활성화 된 윈도우가 포커스를 잃었을 때를 알아내고 싶으신거 같은데,

    구지 Hook 을 하지 않으셔도 됩니다..

    예를 들면,

    procedure AppOnMessage(var Msg: TMsg; var Handled: Boolean);
    ...

    procedure FormCreate(Sender: TObject); ...
    begin
    Application.OnMessage := AppOnMessage;
    end;


    procedure AppOnMessage(var Msg: TMsg; var Handled: Boolean);
    begin
      if Msg.Message = WM_DEACTIVATED then <- 포커스를 잃었을때..
      begin
       .. 하고픈 동작

    정도로 해주셔도 될것 같습니다.

    또한 활성화된 윈도우를 찾아내거나 활성화 시킬때 쓰이는  
    API 함수들도 존재합니다.

    적절히 사용하세요..

    GetForeGroundWindow();
    SetForeGroudWindow();
    GetActiveWindow();
    SetActiveWindow();

    바로 적은 글이므로 컴파일은 안됩니다. 잘 .. 잘 응용해서 사용하세요..