Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > OleContainer ms word сменить раскладку


Автор: rith2 19.5.2009, 20:38
Привет!

Ситуация - гружу в OleContainer ms word, как только делаю OleContainer.DoVerb(ovShow) и в контейнере появляется ms word, то раскладка клавые перестает меняться в том числе средствами винды (alt+shift например)

Код

  OleContForm.OleCont.CreateObjectFromFile('G:\Doc1.doc',False);
  OleContForm.OleCont.DoVerb(ovShow);


Пробовал регистрировать в приложении собственный hotkey

Код

procedure TForm1.WM_HotKeyHandler (var Message: TMessage);
  var
    idHotKey: integer;
    fuModifiers: word;
    uVirtKey: word;
begin

  idHotkey:= Message.wParam;
  fuModifiers:= LOWORD(Message.lParam);
  uVirtKey:= HIWORD(Message.lParam);

  if (fuModifiers = mod_alt) and (uVirtKey = VK_RIGHT) then
    begin
       caption:='Alt- ->> нажата';
       ActivateKeyboardLayout(0,HKL_NEXT); //переключаю раскладку
    end;
  inherited;
end;


Вариат срабатывает, то есть hotkey работает, но раскладку никак не меняет (проверял в приложении без OleContainer - работает )

Перехватывал нажатие  с помощью hook:

Код

function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
var
  idHotKey:integer;
  fumod:WORD;
  ukey:word;
begin
    Wnd:=TMsg(Pointer(lParam)^).hwnd;
    if TMsg(Pointer(lParam)^).message = wm_rbuttondown  then //щелчок правой кнопкой мыши
      begin
       ActivateKeyboardLayout(0,HKL_NEXT); //переключаю раскладку
       ShowMessage('событие хука');
      end;
    Result:= CallNextHookEx(SysHook, Code, wParam, lParam);
end;

procedure hook(switch : Boolean) export; stdcall;
begin
  if switch=true then
    begin
      SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance, 0);
      if SysHook <> 0 then
          MessageBox(0, 'HOOK1 установлен !', 'Message from Exampel1/Process1', 0)
      else
          MessageBox(0, 'HOOK1 установить не удалось !', 'Message from Exampel1/Process1', 0);
    end
  else
     begin
       if UnhookWindowsHookEx(SysHook) then
            MessageBox(0, 'HOOK1 снят !', 'Message from Exampel1/Process1', 0)
       else
            MessageBox(0, 'HOOK1 снять не удалось !', 'Message from Exampel1/Process1', 0);

   SysHook := 0;
   end;
end;
exports hook;
begin
end.


Щелчок правой кнопкой перехватывается, но на раскладку это никак не влияет (проверял в приложении без olecontainer - все работает).
Если перед сменой раскладки сделать например 

Код

OleContainer.Visible := False 
//Смена раскладки
OleContainer.Visible := True

 или просто свернуть работающее приложение, то раскладка тогда меняется, НО в этот момент приложение некрасиво моргает, а после появления у ms word в контейнере отсутствует панель инструментов.

Состояние близкое к отчанию.....     smile 

Пжлста помогите!

Автор: rith2 20.5.2009, 15:44
Тут мысль была - отобрать у OleContainer Focus - фокус отбирается, но раскладка все равно не менятся...

Автор: Rrader 20.5.2009, 16:54
Наблюдаю такое в Delphi7. В 2007-2009 это исправлено. Сравнил исходники компонента в разных версиях - отличий нет (только одно свойство для мыши и комментарий вверху). Причина где-то в недрах VCL. Где, надо поискать smile 

Автор: rith2 20.5.2009, 18:25
И впрямь... в Делфи 2009 все отлично работает....    smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)