Q&A

  • 도와 주세요...
안녕하세요...



개발한지는 조금 되었지만 델파이는 이번에 처음 사용하게된



개발자입니다...



부탁드릴 일이 있어서 이렇게 메일을 보냅니다...





-------------------------------------------------------

으....살려 주세요.....





익스플로어의 주소입력창에 주소입력후에 엔터 이벤트가 발생하



는 것을 기다렸다가...이벤트를 캡춰해서 제가 원하는 곳



즉, www.delphi.co.kr로 이동을 시키는 프로그램을



짜볼려고 합니다



도와 주세요...고수님들.....

------------------------------------------------------





안녕히 계세요 ^^; 꾸벅....

2  COMMENTS
  • Profile
    정용진 2000.04.04 22:24
    정영대님인가?

    전철호님인가?



    홈페이지에서 tip을 검색해보면 url제어에 관한 설명이 있던것 같던데요.

    검색하다...눈에 띄인것 같은데.... 한번 찾아보세요.





    정 민수 wrote:

    > 안녕하세요...

    >

    > 개발한지는 조금 되었지만 델파이는 이번에 처음 사용하게된

    >

    > 개발자입니다...

    >

    > 부탁드릴 일이 있어서 이렇게 메일을 보냅니다...

    >

    >

    > -------------------------------------------------------

    > 으....살려 주세요.....

    >

    >

    > 익스플로어의 주소입력창에 주소입력후에 엔터 이벤트가 발생하

    >

    > 는 것을 기다렸다가...이벤트를 캡춰해서 제가 원하는 곳

    >

    > 즉, www.delphi.co.kr로 이동을 시키는 프로그램을

    >

    > 짜볼려고 합니다

    >

    > 도와 주세요...고수님들.....

    > ------------------------------------------------------

    >

    >

    > 안녕히 계세요 ^^; 꾸벅....

  • Profile
    하얀까마귀 2000.04.05 01:53
    안녕하세요 하얀까마귀 입니다...



    질문 올리신것 보구 재미있을것 같아서 그냥 만들었는데.... 생각보다



    좀 걸렸네요.. 1시간이 넘게 걸렸어요.. 흑흑....



    조금 설명을 하면



    메세지 훅을 해서 키보드의 엔터키를 누를때



    활성화 되어있는 (윈도우즈에서 키보드 입력은 활성화 되어있는 윈도우에서



    포커스가 있는 콘트롤 하나에만 존재하죠... 따라서 모든 키보드 입력은 단 하나의



    윈도우에만 보내어 지게 되어있죠 )



    윈도우를 찾아서 이게 ie인지 검사하고요... 그리고 키보드 입력도 다양하게 발생을

    하니까... url입력하는 주소부분에서 입력했는지 검사해서 맞으면



    이부분에 원하는 주소 넣고 엔터키 이벤트를 발생시킵니다....



    메세지 훅을 이용했기 때문에 dll 로 만들어져 있습니다.



    전체 소스 올려드리니까 보시구 참고 하세요...



    library uHookDll;



    uses

    SysUtils,

    Classes, Windows,Messages , dialogs;



    var

    HIEHook : HHOOK;

    Const

    HookDataFileName = 'c:uHookDll.Dat';

    cIE50 = 'IEFrame';

    cIE40 = 'CabinetWClass';

    cURLINPUT = 'Edit';





    {$R *.RES}



    procedure SetURL( fIEHandle : THandle; fURL : String );

    begin

    SendMessage(fIEHandle, WM_SETTEXT, 0, LPARAM(PChar(fURL)));

    SendMessage(fIEHandle, WM_KEYDOWN, VK_RETURN, 0);

    end;





    procedure ReadData;

    var

    F : TFileStream;

    begin

    // 이건 그냥 혹시나 하는 마음에 쓴겁니다.

    F := TFileStream.Create(HookDataFileName, fmOpenRead);

    try

    F.Read(HIEHook, sizeof(HIEHook));

    finally

    F.Free;

    end;

    end;



    procedure WriteData;

    var

    F : TFileStream;

    begin

    // 이것 또한 파일에다가 그냥 어떻게 되어 있다는걸

    //쓴겁니다.

    F := TFileStream.Create(HookDataFileName, fmCreate);

    try

    F.Write(HIEHook, sizeof(HIEHook));

    finally

    F.Free;

    end;

    end;



    function MyChangeURL(Code : Integer; wParam : WPARAM; lParam : LPARAM)

    : LongInt; stdcall;

    var

    IEHandle : THandle;

    fClassName : String;

    i : Integer;

    begin

    if HIEHook = 0 then

    ReadData;



    // 여기서 부터가 진짜 루틴입니다.

    if ( Code >= HC_ACTION ) then

    begin

    // 우선 키보드 값중 엔터키일때만 처리합니다.

    if wParam = VK_RETURN then

    begin

    // 그 현재 활성화 되어있는 윈도우의 핸들을 가져옵니다.

    // 이 엔터키가 어떤 윈도우에서 발생했는지 알아야 하니까.

    IEHandle := GetForegroundWindow();

    // 활성화 되어있는 윈도우의 클래스 명을 가져 옵니다.

    // 프로그램이 IE인지 아니지를 구분하기 위해서는 className을 비교해야 합니다.

    SetLength(fClassName, 100); // 클래스명을 불러오기 전에 변수의 길이를 정합니다. 그냥 100이면 충분하겠죠?

    i := GetClassName(IEHandle, PChar(fClassName), 100);

    // 넘겨준 클래스명 길이만큼 다시 길이를 잡아줍니다.

    SetLength(fClassName, i);



    /// 클래스 명이 0이면 에러입니다.

    if i > 0 then

    begin

    // 클래스 명이 ie 5.0 일때만 처리합니다.

    if ( fClassName = cIE50 ) then

    begin

    // IE중에서도 포커스가 어디 있는지 검사합니다.

    // 어떤 값 입력중에 다른 곳으로 이동하면 안되니까..

    IEHandle := GetFocus();

    SetLength(fClassName, 100); // 클래스명을 불러오기 전에 변수의 길이를 정합니다. 그냥 100이면 충분하겠죠?

    i := GetClassName(IEHandle, PChar(fClassName), 100);

    SetLength(fClassName, i);

    if i > 0 then

    begin

    // IE 5.0에서 url입력하는 부분의 클래스 명은

    // Edit 입니다..... 이건 4.0은 잘 모르겠어요...

    // 그래서 5.0에서만 동작하도록 되어있죠.....

    //4.0이 있으시면 델파이에 있는 winsight32를 실행하면 클래스 명을 알수 있을겁니다.

    if Trim(fClassName) = cURLINPUT then

    begin

    SetURL ( IEHandle, 'http://delphi.co.kr/');

    Exit;

    end;

    end;

    end;

    end;

    end;

    end;



    Result := CallNextHookEx(HIEHook, Code, wParam, lParam);

    end;



    function HookIE : Boolean;

    begin

    // 키보드에 훅을 거는 겁니다. 처리는 MyChangeURL에서

    // 하도록 한거죠..

    HIEHook := SetWindowsHookEx(

    WH_KEYBOARD, MyChangeURL, HInstance, 0);

    Result := Boolean(HIEHook);

    { 파일에 훅핸들 쓰기 }

    WriteData;

    end;



    function UnHookIE : Boolean;

    begin

    if HIEHook = 0 then

    ReadData;

    // 걸었던 훅을 헤제 합니다.

    Result := UnhookWindowsHookEx(HIEHook);



    end;



    Exports HookIE, UnHookIE;



    begin

    HIEHook := 0;

    end.





    ///////////////////////////////////////////////////////////

    여기 까지가 dll 소스 입니다...



    dll만드는 방법은 file-> New 에 보시면 dll 이라고 있습니다.



    그냥 여기에 제가 드린 소스를 붙이시면 될겁니다..



    //////// 여기서 부터는 이 dll의 훅을 걸고 해제하는 겁니다.....

    아주 간단하죠...



    unit uHook;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    StdCtrls;



    function UnHookIE : Boolean; external 'uHookDll.dll';

    function HookIE : Boolean; external 'uHookDll.dll';

    // 요거를 추가하고

    type

    TForm1 = class(TForm)

    procedure FormClose(Sender: TObject; var Action: TCloseAction);

    procedure FormCreate(Sender: TObject);

    private

    { Private declarations }

    public



    { Public declarations }

    end;

    var

    Form1: TForm1;



    implementation



    {$R *.DFM}







    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

    begin

    UnHookIE;

    end;



    procedure TForm1.FormCreate(Sender: TObject);

    begin

    HookIE;

    end;

    // 요렇게 해주면 됩니다.

    end.