프로그래밍/델파이

Delphi에서 Activeform에서 F5를 눌러도 ActiveX폼이 먼저 액션을 취하도록

panpro 2007. 3. 21. 21:04
손병찬 wrote:
> 익스플로에서 ActiveX폼을 올린다음 익스플로를 ActiveX폼이제어할려면 어떻게 해야합니까?? 예를들어 익스플로에서 F5(새로고침)을 누르면 ActiveX폼이 먼저 액션을 취하게 하고싶어요..

간단하게 예제로 설명 드리겠습니다.

IOleInPlaceActiveObject 를 상속받습니다.

TOCXControl = class(TActiveForm, IOCXControl, IOleInPlaceActiveObject);

이런식으로요.

  function PreTranslateMessage(var Msg: TMsg): BOOL;
  function TranslateAccelerator(var Msg: TMsg): HRESULT; stdcall;
  function OnFrameWindowActivate(fActivate: BOOL): HResult; stdcall;
  function OnDocWindowActivate(fActivate: BOOL): HResult; stdcall;
  function ResizeBorder(const rcBorder: TRect; const uiWindow:
    IOleInPlaceUIWindow; fFrameWindow: BOOL): HResult; stdcall;
  function EnableModeless(fEnable: BOOL): HResult; stdcall;
  function GetWindow(out wnd: HWnd): HResult; stdcall;
  function ContextSensitiveHelp(fEnterMode: BOOL): HResult; stdcall;

를 public 안에 추가하고 구현해 줍니다. 인터페이스 구현부입니다.

function TOCXControl.PreTranslateMessage(var Msg: TMsg): BOOL;
begin
result := false;
case Msg.message of
  WM_KEYDOWN,
  WM_KEYUP:
  begin
 
    case Msg.wParam of // F3, F11, TAB, 방향키는 제외
      // place as many as you want such as VK_F4, VK_F12, etc.
      VK_F3,
      VK_F5:
      begin
        // 콘트롤에게 메세지를 직접 보내세요. 아니면 바로 여기서 처리하세요.
        result := true; // Tell IE we've handled these, otherwise return false!
      end;
             
    end;

  end;

end; //end case
end;


function TOCXControl.TranslateAccelerator(var msg: TMsg): HResult;
var
Used: boolean;
begin
// 이 키를 핸들링하고 있습니까? 또는 IE 는 그것들을 핸들링하고 있습니까?
Used := PreTranslateMessage(Msg);
if (Used) then
  result := S_OK // 키를 핸들링
else
  result := S_FALSE; //Le IE handling the key!
  // Beep;
end;

function TOCXControl.GetWindow(out wnd: HWnd): HResult;
begin
// FWincontrol 은 당신의 콘트롤입니다. 이름은 당신이 정한대로...
if self.HandleAllocated then
begin
  wnd := FWincontrol .Handle;
  Result := S_OK;
end
else
  Result := E_FAIL;
end;

나머진 전부 Result := S_OK; 해주신 후 PreTranslateMessage 에서 입력받기를 원하는 키를 잡아서 처리하심 됩니다..

그럼 즐푸하세요~