Q&A

  • 마우스 커서뒤의 텍스트는 어떻게 알아내죠?
영한사전같은 프로그램을보면 화면안의 임의의 글자위에 마우스 커서만 갖다데면

귀신같이 읽어내는데 어떻게 하는건지 도무지 모르겠어요.



예전에 어디선가 소스를 본적이 있었는데 이제 필요해서 찾으려고 국내외

사이트를 다 뒤져도 못찾겠네요.



아시는 분 제발 좀 가르쳐 주세요.



특정 프로그램의 특정 윈도우의 변화를 계속 모니터하는 프로그램을

만들어야 하는데 위의 방법이 어려우시면

특정 윈도우의 Label 이나 Edit 같은 컨트롤의 텍스트를 읽을수 있는 방법이라도

가르쳐 주십시요.







4  COMMENTS
  • Profile
    안영기 2000.11.03 18:49
    김광수 wrote:

    > 영한사전같은 프로그램을보면 화면안의 임의의 글자위에 마우스 커서만 갖다데면

    > 귀신같이 읽어내는데 어떻게 하는건지 도무지 모르겠어요.

    >

    > 예전에 어디선가 소스를 본적이 있었는데 이제 필요해서 찾으려고 국내외

    > 사이트를 다 뒤져도 못찾겠네요.

    >

    > 아시는 분 제발 좀 가르쳐 주세요.

    >

    > 특정 프로그램의 특정 윈도우의 변화를 계속 모니터하는 프로그램을

    > 만들어야 하는데 위의 방법이 어려우시면

    > 특정 윈도우의 Label 이나 Edit 같은 컨트롤의 텍스트를 읽을수 있는 방법이라도

    > 가르쳐 주십시요.



    영한 사전에서 사용되는 방법은 Windows API 중에 TextOut 계열의 함수를

    교체하는 방법을 사용합니다.



    TextOut 이라는 함수가 있는 포인터를 자신이 만든 함수로 대체시키면

    가능한 것인데요...



    일단 차례를 보면요...



    1. TextOut API 의 포인터를 알아낸다. ( Virtual???? 라는 함수인데 기억이..)

    2. 실제 TextOut 함수를 저장하고 자신이 만든 A 라는 함수로 대체한다.

    3. 마우스를 불특정 텍스트로 가져 간다..

    4. 마우스가 있는 영역에 WM_PAINT 메시지를 날린다.

    5. WM_PAINT 메시지를 받은 불특정 app. 는 당연히 그래픽을 갱신하게되고

    이 과정에서 텍스트를 갱신하기 위해서 TextOut 함수를 호출한다.

    6. 그러명 이미 TextOut 함수는 프로그램에 의해 A 라는 함수로 대체되었고

    (HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cbString)

    로 선언된 함수이기 때문에 2번째, 3번째 파라메터는 찍을 위치를 나타내고

    4번째 파라메터는 찍을 텍스트를 나타낸다. 그래서 마우스와의 위치를

    (x,y) 와 계산해보면 현재 마우스 아래에 있는 글자가 뭔지 알 수 있다.

    7. 문자 판별이 끝났으면 저장해 두었던 원래의 TextOut 에 다시 파라메터를

    넘겨주면 된다.

    8. 그리고 인류 공영과 민족 번영을 위해 이바지한다.



    이러한 과정입니다..



    도스의 Real Mode 때라면 더 간단했을 일인데.. 윈도우즈이다보니

    이런 여러 과정을 거쳐야 합니다..





  • Profile
    김광수 2000.11.03 20:53


    답변 대단히 고맙습니다.



    이런 방법이 있는 줄은 제 실력으론 생각도 못했을 겁니다.



    하지만 제가 초보라서 TextOut API 함수를 교체하는 방법을 모릅니다.



    바쁘시겠지만 간단한 소스나 자료가 있을만한 곳을 가르쳐 주십시요.



    부탁드립니다.



  • Profile
    안영기 2000.11.04 02:38
    김광수 wrote:

    >

    > 답변 대단히 고맙습니다.

    >

    > 이런 방법이 있는 줄은 제 실력으론 생각도 못했을 겁니다.

    >

    > 하지만 제가 초보라서 TextOut API 함수를 교체하는 방법을 모릅니다.

    >

    > 바쁘시겠지만 간단한 소스나 자료가 있을만한 곳을 가르쳐 주십시요.

    >

    > 부탁드립니다.

    >



    www.delphikorea.com 의 팁란에 보면 '유수'님께서 함수 포인터

    교체하는 것에 대한 소스를 올리셨습니다..



    아마 그걸 사용하면 되지 않을까 생각하는데요..

    ( 저도 직접 확인을 안해봤습니다만 잘 되겠죠.. )



    만약 VirtualProtect() 함수가 LoadLibrary 로 읽어들인 함수의

    포인터만 바꾼다면 현재 application 에서만 적용될 가능성이

    많습니다..



    그럴 때는 실제 메모리 내에 GDI32.DLL 이 올라와 있는 물리적

    주소에 접근해서 가로채기를 하거나 그 진입 부분에서 사용자

    Application 으로 점프하는 기계어 코드를 삽입 해서 ( 바이러스

    가 하는 것 처럼.. ) 일단 사용자측으로 한번 넘어 왔다가

    돌아가게 하는 방법도 생각해 볼 수 있겠습니다.



    예전에 제가 처음 그 방법을 들었을 때는 windows 3.1 시절이었기

    때문에 직접 메모리에 접근이 가능했었는데요...

    Win95 이후로 부터는 virtual memory 개념으로 접근하기 때문에

    정확한 물리적 주소를 찾아서 read/ write 하는 방법은 잘

    모르겠습니다. ( 어디선가 물리적 메모리에 바로 접근하는 방법을

    읽은 적이 있는데요.... 설마 DDK 레벨은 아니겠죠..)



  • Profile
    윤종필 2000.11.03 18:02
    글쎄요.

    일반 텍스트라면 잘 모르겠구요.

    Label 또는 Edit 에 마우스가 있는지여부는



    property OnMouseEnter : TNotifyEvent

    read fOnMouseEnter write fOnMouseEnter;

    property OnMouseLeave : TNotifyEvent

    read fOnMouseLeave write fOnMouseLeave;



    와 같이 정의해 두고요.



    if Assigned( fOnMouseEnter ) then



    와 같은 방법을 알아낼수 있습니다.

    마우스가 나가면



    if Assigned( fOnMouseLeave ) then

    로 하구요.







    김광수 wrote:

    > 영한사전같은 프로그램을보면 화면안의 임의의 글자위에 마우스 커서만 갖다데면

    > 귀신같이 읽어내는데 어떻게 하는건지 도무지 모르겠어요.

    >

    > 예전에 어디선가 소스를 본적이 있었는데 이제 필요해서 찾으려고 국내외

    > 사이트를 다 뒤져도 못찾겠네요.

    >

    > 아시는 분 제발 좀 가르쳐 주세요.

    >

    > 특정 프로그램의 특정 윈도우의 변화를 계속 모니터하는 프로그램을

    > 만들어야 하는데 위의 방법이 어려우시면

    > 특정 윈도우의 Label 이나 Edit 같은 컨트롤의 텍스트를 읽을수 있는 방법이라도

    > 가르쳐 주십시요.

    >

    >

    >