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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.