Toolbar, CLockKeybrdHook и backspace?
От: xromax  
Дата: 05.03.08 11:35
Оценка:
Здраствуйте!

Вобщем делаю обработчик бэкспейса, чтобы он работал как бекспейс в окне Edit Combobox.

На компьютере, где собирается длл тулбара, где собственно стоит визуал студия, все работает ок, т.е. при бекспейсе символы удаляются (удаляю я кстати в ручную :( )
Но при установке тулбара на другой комп, бекспейс не работает как нужно, т.е. не удаляет символы в окне edit :(
В чем трабл может быть?

Просто я пробовал обычным методом, прочитав пару тем про проблемы бекспейса в тулбаре, но никак не получается перехватывать фокусы и собственно обрабатывать нажатие клавиш :(, поэтому и с табом так же проблему не решил, т.е. при нажатии на таб нужно менять фокус с текущего окна тулбара на следующее, но в любом случае фокус падает на адресную строку IE.

Вот вырезки из кода:
кривовато и кустарно конечно, но подругом не смог :(
там где lParam==917505, я не знаю что это такое, скорее всего состояние клавиши, т.е. на нажатие, если его убрать удаляться будет не по одному, а по нескольку символов


...
POINT pt; 
pt.x = 1; 
pt.y = 1; 
hwndEd1 = ChildWindowFromPoint(hwndCombo1, pt); 
hwndEd2 = ChildWindowFromPoint(hwndCombo2, pt);                
hook1 = new CLockKeybrdHook(hwndEd1);
hook2 = new CLockKeybrdHook(hwndEd2);
....

class CLockKeybrdHook
{
private:
   HWND hWnd;   
   HHOOK hHook;
   static LRESULT WINAPI KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
public:
   CLockKeybrdHook(HWND hWnd_)
   {
      hWnd = hWnd_;
      hHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, (HINSTANCE)NULL, GetCurrentThreadId());
   };
   ~CLockKeybrdHook()
   {
      UnhookWindowsHookEx(hHook);
   };  
}; 

 CLockKeybrdHook *hook1(NULL);
 CLockKeybrdHook *hook2(NULL);

LRESULT WINAPI CLockKeybrdHook::KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
 HWND result;
 HHOOK hHookCur;
    HWND hWndCur;
    hWndCur=GetFocus();
    
        if(hWndCur==hwndEd1)
            hHookCur=hook1->hHook;
        else 
        {
            if(hWndCur==hwndEd2)
                hHookCur=hook2->hHook;
        }
    }
if(hWndCur==hwndEd1 ||hWndCur==hwndEd2 )
{
if (nCode < 0) 
            return CallNextHookEx(hHookCur, nCode, wParam, lParam);
        switch (nCode)
        {
        case HC_ACTION:
            {   
                switch (wParam)
                {    
                    case VK_BACK:                                           
                        if((hWndCur==hwndEd1 || hWndCur== hwndEd2) && lParam==917505)
                        {                            
                            DWORD start_pos;
                            SendMessage(hWndCur, EM_GETSEL, (WPARAM) &start_pos,NULL);
                            if(start_pos!=0)
                            {        
                                SendMessage(hWndCur,EM_SETSEL,(WPARAM) start_pos-1,(WPARAM) start_pos);
                                SendMessage(hWndCur,WM_CLEAR,0,0);
                            }                            
                        }
                        break;
                                 ...
                                }
}
return 0;
}
Re: Toolbar, CLockKeybrdHook и backspace?
От: algol Россия about:blank
Дата: 05.03.08 14:29
Оценка:
Здравствуйте, xromax, Вы писали:

X>Вобщем делаю обработчик бэкспейса, чтобы он работал как бекспейс в окне Edit Combobox.


Речь об тулбаре для IE? Не надо никаких хуков и прочей самодеятельности, надо просто заимплементить IInputObject (UIActivateIO, HasFocusIO, TranslateAcceleratorIO) и сообщать эксплореру об изменении фокуса через m_pSite->OnFocusChangeIS().
Re[2]: Toolbar, CLockKeybrdHook и backspace?
От: xromax  
Дата: 06.03.08 09:48
Оценка:
Здравствуйте, algol, Вы писали:

A>Здравствуйте, xromax, Вы писали:


X>>Вобщем делаю обработчик бэкспейса, чтобы он работал как бекспейс в окне Edit Combobox.


A>Речь об тулбаре для IE? Не надо никаких хуков и прочей самодеятельности, надо просто заимплементить IInputObject (UIActivateIO, HasFocusIO, TranslateAcceleratorIO) и сообщать эксплореру об изменении фокуса через m_pSite->OnFocusChangeIS().


дак не работает никак :(

например тот же фокус
case WM_SETFOCUS:
return OnSetFocus();

не заходит сюда и во все перечисленные функции при смене/установке фокуса, например.
у меня m_pSite это объект CComPtr<IWebBrowser2>, из-за этого наверное?
Re[2]: Toolbar, CLockKeybrdHook и backspace?
От: xromax  
Дата: 06.03.08 12:41
Оценка:
Здравствуйте, algol, Вы писали:

A>Здравствуйте, xromax, Вы писали:


X>>Вобщем делаю обработчик бэкспейса, чтобы он работал как бекспейс в окне Edit Combobox.


A>Речь об тулбаре для IE? Не надо никаких хуков и прочей самодеятельности, надо просто заимплементить IInputObject (UIActivateIO, HasFocusIO, TranslateAcceleratorIO) и сообщать эксплореру об изменении фокуса через m_pSite->OnFocusChangeIS().


а почему хуки могут не работать на другом компьютере?
Re[3]: Toolbar, CLockKeybrdHook и backspace?
От: algol Россия about:blank
Дата: 06.03.08 12:53
Оценка:
Здравствуйте, xromax, Вы писали:

X>например тот же фокус

X>case WM_SETFOCUS:
X> return OnSetFocus();
X>не заходит сюда и во все перечисленные функции при смене/установке фокуса, например.

У кого и как вы ловите WM_SETFOCUS?

X>у меня m_pSite это объект CComPtr<IWebBrowser2>, из-за этого наверное?


m_pSite это CComPtr<IInputObjectSite>.
Re[4]: Toolbar, CLockKeybrdHook и backspace?
От: xromax  
Дата: 07.03.08 11:28
Оценка:
Здравствуйте, algol, Вы писали:

A>У кого и как вы ловите WM_SETFOCUS?

в WndProc

A>m_pSite это CComPtr<IInputObjectSite>.


у меня нет такого объекта, у меня есть CComPtr<IWebBrowser2>, с ним я и работаю, я пробовал с CComPtr<IInputObjectSite>, он не подходит, не помню уже из-за чего
Re[5]: Toolbar, CLockKeybrdHook и backspace?
От: algol Россия about:blank
Дата: 07.03.08 11:51
Оценка:
Здравствуйте, xromax, Вы писали:

A>>У кого и как вы ловите WM_SETFOCUS?

X>в WndProc

А конкретней — у тулбара, комбобокса, edit комбобокса, кого-то еще?

A>>m_pSite это CComPtr<IInputObjectSite>.

X>у меня нет такого объекта, у меня есть CComPtr<IWebBrowser2>, с ним я и работаю, я пробовал с CComPtr<IInputObjectSite>, он не подходит, не помню уже из-за чего

У вас тулбар отнаследован от IObjectWithSiteImpl, а у него есть m_spUnkSite, который инициализируется в SetSite(). Можете либо переопределить SetSite,

    if (pUnkSite)
    {
        if (FAILED(pUnkSite->QueryInterface(IID_IInputObjectSite, (void**)&m_pSite))) return E_FAIL;
    }
    return IObjectWithSiteImpl<CToolBand>::SetSite(pUnkSite);


либо получить IInputObjectSite из m_spUnkSite.
Re[6]: Toolbar, CLockKeybrdHook и backspace?
От: xromax  
Дата: 11.03.08 07:07
Оценка:
Здравствуйте, algol, Вы писали:

A>А конкретней — у тулбара, комбобокса, edit комбобокса, кого-то еще?


у меня единственная главная функция WndProc (точнее не совсем главная), которую я задаю при регистрации окна тулбара в BOOL RegisterAndCreateWindow(), которую в свою очередь вызываю в SetSite:


HRESULT hr = pUnkSite->QueryInterface(IID_IOleWindow, 
                     (void **)&pOleWindow);           
        
if(SUCCEEDED(hr))
{
    pOleWindow->GetWindow(&m_hwndParent);
    pOleWindow->Release();    
    if(!RegisterAndCreateWindow())
    return E_FAIL;
}



A>У вас тулбар отнаследован от IObjectWithSiteImpl, а у него есть m_spUnkSite, который инициализируется в SetSite(). Можете либо переопределить SetSite,

A>
A>    if (pUnkSite)
A>    {
A>        if (FAILED(pUnkSite->QueryInterface(IID_IInputObjectSite, (void**)&m_pSite))) return E_FAIL;
A>    }
A>    return IObjectWithSiteImpl<CToolBand>::SetSite(pUnkSite);
A>

A>либо получить IInputObjectSite из m_spUnkSite.

вот у меня идет так:


hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void **)&m_spWebBrowser);
        
        if (SUCCEEDED(hr))
        {    
            // Register to sink events from DWebBrowserEvents2.
            hr = DispEventAdvise(m_spWebBrowser);
    }
   }    

 return IObjectWithSiteImpl<CCallBoomBHO>::SetSite(pUnkSite);


т.е. мне надо к этому еще добавить
pUnkSite->QueryInterface(IID_IInputObjectSite, (void**)&m_pSite)));

?
Re[7]: Toolbar, CLockKeybrdHook и backspace?
От: xromax  
Дата: 11.03.08 08:05
Оценка:
нужно ли добавлять:

BEGIN_MSG_MAP(ххх)    
          MESSAGE_HANDLER(WM_COMMAND, OnCommand)
      MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
      MESSAGE_HANDLER(EN_SETFOCUS, OnSetFocus)
END_MSG_MAP()



что-то вроде этого? может поэтому не работает еще?
Re: Toolbar, CLockKeybrdHook и backspace?
От: xromax  
Дата: 14.03.08 10:55
Оценка:
может кто знает из-за чего хук-то не работает на других машинах?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.