Переключение по Alt-TAB - великая тайна...
От: Iluhin  
Дата: 21.12.06 05:42
Оценка:
Всем привет

Имеется задача — по Alt-TAB свернуть полноэкранное DirectDraw приложение. Приложение там не совсем простое, при сворачивании приходится тормозить поток, останавливать таймер и т.д. Все это успешно делатется и приложение в итоге мирно сворачивается. Однако был замечен следующий глюк: если нажать Alt-TAB и первым отпустить TAB, то все Ок. Но если первым отпустить Alt — имеем не то чтобы зависание, но в общем картинка приложения остается висеть на экране... ПОЧЕМУ ЭТО МОЖЕТ БЫТЬ??? Т.е. какая вообще разница, что первым отпускать?

Это была первая часть Вторая начинается с того, что я решил вообще запретить переключение по Alt-TAB, ибо по Ctrl-ESC или кнопке WIN все сворачивается в любом случае. Для этого использовал соответственно:


m_HK = GlobalAddAtom("alttab"); // DWORD m_HK;
RegisterHotKey(GetSafeHwnd(), m_HK, MOD_ALT, VK_TAB);


Однако выяснилось, что этот запрет легко обоходится либо дабл-кликом на табе (!!!) при зажатом альте, либо при использовании правого альта, а не левого. Это все, конечно, очень забавно, но меня до сих пор мучает вопрос — КАК ПОЛНОСТЬЮ ОТКЛЮЧИТЬ ALT-TAB???

Буду очень признателен за любые соображения по поводу двух этих вопросов...
Re: Переключение по Alt-TAB - великая тайна...
От: febus Германия  
Дата: 24.12.06 19:39
Оценка:
Здравствуйте, Iluhin, Вы писали:

I>Однако выяснилось, что этот запрет легко обоходится либо дабл-кликом на табе (!!!) при зажатом альте, либо при использовании правого альта, а не левого. Это все, конечно, очень забавно, но меня до сих пор мучает вопрос — КАК ПОЛНОСТЬЮ ОТКЛЮЧИТЬ ALT-TAB???


I>Буду очень признателен за любые соображения по поводу двух этих вопросов...


Может так?
Re[2]: Переключение по Alt-TAB - великая тайна...
От: Iluhin  
Дата: 25.12.06 01:26
Оценка:
Здравствуйте, febus, Вы писали:

I>>Однако выяснилось, что этот запрет легко обоходится либо дабл-кликом на табе (!!!) при зажатом альте, либо при использовании правого альта, а не левого. Это все, конечно, очень забавно, но меня до сих пор мучает вопрос — КАК ПОЛНОСТЬЮ ОТКЛЮЧИТЬ ALT-TAB???

I>>Буду очень признателен за любые соображения по поводу двух этих вопросов...

F>Может так?


Да, спасибо за ответ. Но это ведь, я так понимаю, надо будет делать DLL, чтобы поставить хук. Не очень хочется цеплять библиотеку к программе только из-за этого.

ЗЫ. К слову, я заметил, что если сворачивать приложение по ALT-DOUBLETAB, то оно не вешается при любом раскладе
Re[3]: Переключение по Alt-TAB - великая тайна...
От: febus Германия  
Дата: 25.12.06 15:49
Оценка:
Здравствуйте, Iluhin, Вы писали:
I>Да, спасибо за ответ. Но это ведь, я так понимаю, надо будет делать DLL, чтобы поставить хук. Не очень хочется цеплять библиотеку к программе только из-за этого.
I>ЗЫ. К слову, я заметил, что если сворачивать приложение по ALT-DOUBLETAB, то оно не вешается при любом раскладе

Не нужна Dll. Создай пустой проект win32 с единственным cpp-файлом такого содержания:

#define _WIN32_WINNT 0x0400
#include <Windows.h>
#include<conio.h>
#include<stdio.h>
#include <stdlib.h>
#include <string.h>

///////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
{
    BOOL fEatKeystroke = FALSE;
    if (nCode == HC_ACTION) 
    {
        switch (wParam) 
        {
            case WM_KEYDOWN: case WM_SYSKEYDOWN:
            case WM_KEYUP: case WM_SYSKEYUP: 
                PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;
                fEatKeystroke = 
                    ( (p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0) ) ||
                    ( (p->vkCode == VK_ESCAPE) && ((p->flags & LLKHF_ALTDOWN) != 0) ) ||
                    ( (p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 0x8000) != 0) )||
                    ( (p->vkCode == 46) && ( (p->flags & LLKHF_ALTDOWN) != 0 ) && 
                    ( (GetKeyState(VK_CONTROL) & 0x8000) != 0)); 
                //its possible to add other keys....
                //the 46 means del
                break;
                                                          
        }
    }
    return (fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam, lParam));
}

///////////////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, LPSTR pszCmdLine, int) 
{
    // Install the low-level keyboard & mouse hooks
    HHOOK hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL,
        (HOOKPROC)LowLevelKeyboardProc, hinstExe, 0);

    // Keep this app running until we're told to stop
    MessageBox(NULL, 
        TEXT("Alt+Esc, Ctrl+Esc, and Alt+Tab are now not working.\n"),
        TEXT("Disable Low-Level Keys"), MB_OK);
    UnhookWindowsHookEx(hhkLowLevelKybd);
    return 0;
}
Re[4]: Переключение по Alt-TAB - великая тайна...
От: Iluhin  
Дата: 26.12.06 03:06
Оценка:
Здравствуйте, febus, Вы писали:

I>>Да, спасибо за ответ. Но это ведь, я так понимаю, надо будет делать DLL, чтобы поставить хук. Не очень хочется цеплять библиотеку к программе только из-за этого.

I>>ЗЫ. К слову, я заметил, что если сворачивать приложение по ALT-DOUBLETAB, то оно не вешается при любом раскладе

F>Не нужна Dll. Создай пустой проект win32 с единственным cpp-файлом такого содержания:


О, действительно работает Еще раз спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.