• 0
Вадим Смоленский

TWebBrowser и нажатия клавиш

Вопросы

Windows, Berlin. Когда TWebBrowser на форме получает фокус, он начинает перехватывать все нажатия клавиш. До FormKeyDown управление уже не доходит. Отключение свойства браузера CanFocus не помогает, своего события OnKeyDown у него нет. Как быть? В идеале хотелось бы оставить браузеру навигационные клавиши (стрелки, PgDn, PgUp, Home, End), но все остальные отправлять на форму. Возможно ли это?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 ответа на этот вопрос

  • 0
11 час назад, Вадим Смоленский сказал:

Возможно ли это?

нет. Веббраузер - нативный компонент, со своим собственным механизмом работы. Емнип, даже под Windows, даже используя штатный полнофункциональный IWebBrowser2 вы не получите нажатия из него.

На винде вы можете поставить хук на клавиатуру и получать все клавиши вне зависимости от того,  в какой контрол они летят. На мобильных платформах - нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
3 часа назад, Вадим Смоленский сказал:

Что это за зверь?

https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms644959(v=vs.85).aspx

Смотреть в основном про WH_KEYBOARD (перехват в рамках приложения) или WH_KEYBOARD_LL (перехват в рамках всей системы).

Примеров в гугле должно быть навалом, подойдут даже от D7 (возможно - с поправкой на юникод), ибо этот механизм не менялся уже сто лет.

Но - еще раз подчеркну - это привязка к винде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Похожий контент

    • От Вадим Смоленский
      Перейдя с Берлина на Токио, столкнулся с неприятным феноменом. Раньше, выводя на экран форму с обилием TLabel, которые нужно было заполнить текстом и выровнять, я спокойно ставил везде AutoSize=True, присваивал нужные значения полям Text, после чего ширина каждого TLabel принимала новое значение, и мой код их красиво выравнивал. Теперь же ширина не меняется до полной отрисовки на экране всего и вся. Соответственно, на этапе выравнивания код оперирует со значениями ширины, которые были еще на этапе дизайна. Как следствие - всё наперекосяк! Что делать?
    • От Вадим Смоленский
      Работаю в Windows с FireDAC (SQLite). При каждом обращении к базе данных экранный курсор превращается в песочные часы с надписью SQL. Пользователи моего продукта далеки от программирования и ни про какой SQL не слыхивали, им это совершенно ни к чему. Как мне подавить этот феномен? В свойствах TFDConnection я ничего на эту тему не нахожу...
    • От Вадим Смоленский
      Мастерю из TRectangle всплывающую подсказку с тенью и анимацией (увеличиваю Opacity от 0 до 1). Без TFloatAnimation тень нормально отображается, а с анимацией пропадает. Действительно ли здесь есть какие-то ограничения, или проблему можно решить?
    • От Alex7wrt
      Пытаюсь считывать данные с ком порта (RS232).
      При считывании иногда происходит сдвиг строки на байт, из-за чего происходят ошибки при обработке поступающих данных:
      2552525017500200333610166057255
      25250175002001410166053255252
      501750020034361016615725525250
      1750020024101661532552525017
      50020036361016635725525250175
      002004410166353255252501750
      02004036101651582552525017500
      200841016515425525250175002
      Тогда как правильно должно быть, чтобы каждая строка начиналась на 25. В сторонних прогах работы с ком портом всегда так и есть.
      В то же время, иногда после переключения ком порта считывание проиходит правильно, поэтому думаю, что ошибка может быть в настройках соединения с портом или задержках.
      Вот параметры работы ком порта, от изготовителя устройства:

      Вот как я настраиваю порт в программе: 
      procedure TForm1.Button1Click(Sender: TObject); begin ComFile:=CreateFile('com2',GENERIC_READ,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,0); if ComFile=INVALID_HANDLE_VALUE then begin ShowMessage('Не удалось открыть порт '); exit; end; SetupComm(ComFile,18,18); GetCommState(ComFile,DCB); with DCB do begin BaudRate:=57600; ByteSize:=8; Parity:=NoParity; StopBits:=OneStopBit; end; if not SetCommState(ComFile,DCB) then begin ShowMessage('Порт не настроен'); CloseHandle(ComFile); exit; end; StartComThread; end; procedure TCommThread.Execute; begin Repeat QueryPort; Sleep(100); Until Terminated; end; rocedure TCommThread.QueryPort; var MyBuff:array [0..17] of Char; i: byte; Begin all_buf:=''; FillChar(MyBuff,SizeOf(MyBuff),#0); ReadFile(ComFile,MyBuff,SizeOf(MyBuff),BytesRead,Nil); If BytesRead>0 Then Begin for i:=0 to length(Mybuff)-1 do begin all_buf:=all_buf+inttostr(ord(MyBuff[i])); end; // Form1.Memo1.Lines.Add(all_buf); End; end; Где может быть ошибка?
    • От Вадим Смоленский
      Этот вопрос сложился из двух, которые я здесь уже задавал, но ответов не получил. Первый касался странного поведения TWebBrowser. Второй - ненужного мелькания в виде белого квадрата при вызове TPopup и TPopupMenu. Теперь оказалось, что эти проблемы связаны. Мне удалось их воспроизвести в маленьком демонстрационном проекте (Windows), который прилагаю в виде зипа и скриншота.

      Кнопка Hide/Show прячет и снова показывает TWebBrowser. Но если хоть один раз (когда TWebBrowser виден) вызвать TPopupMenu или TPopup, это перестает работать - TWebBrowser отказывается прятаться. Характерно еще то, что в момент вызова TPopupMenu или TPopup в левом верхнем углу формы на долю секунды появляется непрошенный белый квадрат, и на эту же долю секунды TWebBrowser пропадает.
      Если минимизировать форму в трей и снова открыть (при условии, что TWebBrowser при этом как бы не виден, т.е. после нечетного числа щелчков по кнопке), то функциональность восстанавливается. Иными словами, проблема в отрисовке. Своими силами справиться не смог. Буду признателен за дельный совет. Побороть белый квадрат тоже очень хотелось бы, с ним некрасиво.
      TWebBrowserProblem.zip
    • От Вадим Смоленский
      Работаю в Berlin, делаю приложение под Windows. При каждом вызове метода Popup для TPopupMenu, а также при создании и выводе на экран компонента TPopup, в левом верхнем углу формы на долю секунды появляется белый прямоугольник 50х50 пикселей. Нельзя ли как-нибудь это явление подавить?

    • От Pax Beach
      Мне нужно сделать снимок экрана из своего приложения в приложении DirectX (в игре).
      По-быстрому накидал приложение, исходники здесь: MakeScreenshot-Forum.zip

      1. по нажатию единственной кнопки будет выполнена серия из 16 снимков экрана. Если запущен Скайп, то фотографироваться будет содержимое его окна.
      2. По нажатии CTRL+ALT+F9 будет сделан единичный снимок
      3. Label внизу показывает сколько миллисекунд затрачено на вывод снимка
      4. В комментах так же вы найдете, как работать со снимками через буфер обмена.
       
      Работа выполняется через GetDC(NULL);
      Windows 10 x64. Снимки делаются. И DirectX тоже нормально фотографируется.
      НО! только в оконных приложениях.
      Если приложение DirectX полноэкранное, то на всех снимках одна и та же картинка с первого снимка.
      То есть изменение буфера экрана в приложении ни как не отражается на снимках.
       
      Что нужно? Необходимо делать снимки конкретного приложения через интерфейс DirectX, а точнее, я так понимаю, через DirectShow. Тогда не будет разницы в окне оно или на полный экран.
      Помогите плиз, знающие люди, с решением этой задачи.
      Гарантирую вам от сообщества большой почет, от меня огромный респект, если это принесет доход, то еще и очень приятный бонус.
       
      Ссылки теме:
      1. DIRECTX FOR DELPHI
      2. unofficial version of DelphiX
      3. DirectX для начинающих
      4. MinHook - The Minimalistic x86/x64 API Hooking Library
      5. Various methods for capturing the screen
      6. Вывод графики на рабочий стол Windows с использованием оверлеев DirectX
      7. Project JEDI
      8. Реализация перехвата вызовов API — исчерпывающе про внедрение DLL, если разобраться, + это на Delphi
      UPD:
      9. Серия видео уроков Пишем D3D-хук — все понятно, только в Delphi перенести нужно.
      UPD 2:
      Научился рисовать в Direct3D и ловить интерфейс IDirect3DDevice9. Теперь делаю DLL ловушку для реализации снимков.
       
    • От chaplin.u@gmail.com
      Как определить язык системы в Win10 ?
    • От Вадим Смоленский
      В Object Inspector подгружаю ImageList к TTabControl, иду в отдельные TTabItem, выбираю номера для ImageIndex. Иконки выводятся прижатыми к левому краю. Как выровнять их по центру? Текста не предусматриваю, будут только иконки.
    • От Вадим Смоленский
      Если главное окно приложения для Windows выполнено как MDI и занимает почти весь экран, то пункты главного меню концентрируются слева, оставляя справа длинную пустую полосу. Этого пространства жалко, его можно было бы использовать с пользой - как, собственно, и сделано в интерфейсе RAD Studio: после пункта меню Help идет вертикальная полоска из точек, а дальше иконки, боксы поиска и прочее хозяйство. Как это можно сделать?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу