Q&A

  • Window Message중에서 SB_GETTEXT의 사용법...
외부 프로그램의 핸들을 찾아와서 하위 컨트롤 중 msctls_statusbar32의 핸들값을 찾아 내었습니다.
일반적으로 statusbar를 쓰게 되면 simpletext가 놓여지는 index를 프로그램 내에서 처리할 수 있지만, 외부 프로그램을 감시하는 입장에서 여간 힘든일이 아니더라구요. ㅜㅜ
Message를 추적하여 SB_SETTEXT를 찾아내었습니다. Windows SDK Help를 통하여 용법을 알아서 그 반대되는 SB_GETTEXT도 알아내었습니다. 그런데, Delphi 7에서 제공하는 Message Unit 파일 안에는 WM_GETTEXT와 WM_SETTEXT는 있지만 SB_SETTEXT와 SB_GETTEXT는 없더라구요. WM_은 일반적으로 Edit나 Static의 Caption과 그 Text 내용을 찾아올 수 있지만 StatusBar상의 Text는 찾아올 수 없어서 SB_를 이용해야 될 거 같습니다.

이제부터가 문제입니다.
외부 프로그램에서의 StatusBar의 Text를 가져오고 싶은데 좋은방법은 무엇인가요 ?
SB_GETTEXT를 이용해야 된다면 도대체 Uses문에는 무슨 파일을 Including해야되나요 ?
2  COMMENTS
  • Profile
    최용일 2004.09.30 19:13
    안녕하세요. 최용일입니다.

    SB_GETTEXT, SB_SETTEXT는 CommCtrl유닛에 있습니다.

    SB_GETTEXT로 외부 프로그램의 데이터를 얻어올때는 그 프로그램의 메모리 영역안으로 들어가야 하는걸로 알고 있습니다.

    아마도 후킹외에는 방법이 없을거 같습니다.

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

  • Profile
    모영철 2004.09.30 18:47
    ^^ 찾아보시면 금방 찾으셨을텐데..

    이렇게 제가 답변을 할수 있도록 배려해주셨나 봅니다.

    제가 찾아보니 먼저 C++ 에서는 commctrl.h 파일에

    #define SB_GETTEXT              SB_GETTEXTW
    #define SB_GETTEXTW             (WM_USER+13)

    이렇게 되있더군요..

    그리고 델파이 에서는 commctrl.pas (델파이 6)

    첨엔 이름보고 제가 깐 컴포넌트중에 하나인가 싶었는데..

    아니더군요...델파이에서 만든 겁니다.

    근데 델파이에서는 좀 다르게 되있네요..

    SB_GETTEXT             = SB_GETTEXTA;
    SB_GETTEXTA             = WM_USER+2;

    이렇네요.. 흠 무슨 차이일까..헬프를 봐도 없군요..

    궁금하네요..외다른지..킁 알고보니 C++ 에서는 #IFDEF 이런식으로

    되있네요..

    #ifdef UNICODE
    #define SB_GETTEXT              SB_GETTEXTW
    #define SB_SETTEXT              SB_SETTEXTW
    #define SB_GETTEXTLENGTH        SB_GETTEXTLENGTHW
    #if (_WIN32_IE >= 0x0400)
    #define SB_SETTIPTEXT           SB_SETTIPTEXTW
    #define SB_GETTIPTEXT           SB_GETTIPTEXTW
    #endif
    #else
    #define SB_GETTEXT              SB_GETTEXTA
    #define SB_SETTEXT              SB_SETTEXTA
    #define SB_GETTEXTLENGTH        SB_GETTEXTLENGTHA
    #if (_WIN32_IE >= 0x0400)
    #define SB_SETTIPTEXT           SB_SETTIPTEXTA
    #define SB_GETTIPTEXT           SB_GETTIPTEXTA
    #endif
    #endif

    이렇게 봐야겠군요...제가 그냥 궁금해서 찾아봤습니다.

    결론은 commctrl.pas 파일만 uses절에 포함하시면 됩니다.