ActiveX контрола

3 отговора 201 прегледа
#1

ActiveX контрола

Как мога да накарам ActiveX контрола, регистрирана в Internet Explorer да връща WM_Char съобщения ? Писана е на Visual C++
Когато се ползва с други програми, същата контрола приема без проблем клавиши като back-space, стрелките и др. но в страница на Internet Explorer не ги приема. Явно Internet Explorer филтрира съобщенията към контролата.
Ако някой може да помогне ще съм много благодарен.

Отговор
в отговор на DivKotak #2

Re: ActiveX контрола

Zasto tochno WM_CHAR ? Ne moze li WM_KEYDOWN ?
Bi triabvalo da mozesh da gi hvanesh, zastoto edit kontrolite mogat.
Viz sys Spy++ kakvo minava prez tvoia prozorec i kolko prozoreca ima ActiveX controla ti.

Отговор
в отговор на VBProgrammer #3

благодаря, но ...

благодаря, но съм опитвал и с това - не става
Internet Explorer филтрира входа от клавиатурата и не приема някои клавиши
Когато ползвам контролата в друга моя програма или в документ на Word например - няма проблеми. Приема стрелките и BackSpace но в IE упорито не иска :)

-------------------------
да оставим мисленето за тези които го умеят.

Отговор
в отговор на DivKotak #4

Re: благодаря, но ...

Ето ти сега моето решение Диви Котако,
аз си блъсках главата бая и днеска поизпробвах това-онова докато най-накрая моят контрол тръгна както трябва и под Експлодер-а.

Проблемът се състои във факта, че когато Експлодер-а създава контролите в страницата, описани посредством OBJECT-тага, той не ги активира напълно - т.е. хостнатите контроли не са UI-активирани. Вследствие на което WebBrowser-интерфейса на Експлодер-а не им праща WM_KEYDOWN и WM_KEYUP съобщенията както трябва (те не минават през PreTranslateAccelerator и TranslateAccelerator методите на съответният ActiveX контрол). Резултата е ясен - работят само клавишите за обикновените символи, останалите клавиши не работят.

Погледни следните страници, може да намериш информациа, която да ти помогне по-нататък ако това което ти пиша не ти помогне.

[линк]
[линк]

1. Прихвани OnCreate на контрола ти и там напиши:

if (!m_bUIActive) InPlaceActivate(OLEIVERB_UIACTIVATE)

това ще ти позволи да ти се активира контрола още при създаването му. Ако аргумента на InPlaceActivate е от тип BOOL тогава напиши TRUE като фактически аргумент на функцията.

2. Прихвани Click-съобщението (WM_LBUTTONDOWN) на твоя контрол и там също напиши горният ред. Ако желаеш контролът ти да се активира и директно когато натиснеш някой клавиш (и ако контролът ти е единствен ActiveX контрол в HTML-страницата) можеш да прихванеш по гореописаният начин и WM_KEYDOWN съобщението.

Извикването на InPlaceActivate функцията води до форсирано UI-активиране на целият ти контрол (активиране на всичките му съставни контроли, на менюта, бар-ове и акселераторни таблици), така Експлодера може вече да праща правилно клавишните съобщения.

Успехи ти пожелавам, дано да съм помогнал на теб а и на други хора в подобно положение.

Отговор