Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Как перекрыть окна в Windows e


Автор: knut 29.9.2006, 13:22
как в windowse можно создат онко чтобы это окно перекрывало весь Deskatop(вместе с taskbar ом)?или же как в windows е можно скрыть активние окна?

Автор: GremlinProg 30.9.2006, 13:32
Цитата(knut @  29.9.2006,  15:22 Найти цитируемый пост)
как в windowse можно создат онко чтобы это окно перекрывало весь Deskatop(вместе с taskbar ом)?

нужно создать окно со след. стилями:
ExStyle = WS_EX_TOOLWINDOW|WS_EX_TOPMOST

Автор: 586 30.9.2006, 15:03
или так:
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), 0);

Автор: knut 2.10.2006, 15:13
GremlinProg, 
Цитата

как в windowse можно создат онко чтобы это окно перекрывало весь Deskatop(вместе с taskbar ом)?или же как в windows е можно скрыть активние окна? 

т.е мне нужно зделать lock как в win e(win+L) и я делаю так но  все равно не работает.
Код

 
                HINSTANCE hInstance;
    HDESK  hdesk = CreateDesktop(_T("Lock"),NULL,NULL,NULL,                                 DESKTOP_CREATEWINDOW ,NULL);
    SetThreadDesktop(hdesk);
    HWND hwnd = CreateWindow(_T("Tset Class"),_T("lock"),WS_DISABLED,                0, 0, CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);

    SwitchDesktop(hdesk);
 

Автор: GremlinProg 2.10.2006, 19:06
ну и в чем проблема, размеры-то выставить надо
укажи габариты окна
Код

    RECT rw;
    ::GetClientRect(GetDesktopWindow(),&rw);
    HWND hwnd = CreateWindowEx(
        WS_EX_TOOLWINDOW|WS_EX_TOPMOST,
        _T("Tset Class"),
        _T("lock"),
        WS_POPUP|WS_DISABLED,
        rw.left,
        rw.top,
        rw.right - rw.left,
        rw.bottom - rw.top,
        HWND_DESKTOP,NULL,hInst,NULL
    );


Автор: dumb 3.10.2006, 01:32
Цитата(GremlinProg @  2.10.2006,  19:06 Найти цитируемый пост)
размеры-то выставить надо

с размерами, как ни странно, все в порядке.

knut,

Код

    HDESK  hdesk = CreateDesktop(_T("Lock"),NULL,NULL,NULL,DESKTOP_CREATEWINDOW ,NULL);

вместо DESKTOP_CREATEWINDOW лучше сразу указать GENERIC_ALL, чтобы потом не париться вопросами типа "почему не создается? почему не переключается?".
Код

    SetThreadDesktop(hdesk);

если на момент вызова этой функции у процесса уже есть окна(в том числе невидимые) или им установлены хуки, то она вернет ошибку(присоединения потока к новому десктопу естественно тоже не произойдет).
Код

    HWND hwnd = CreateWindow(_T("Tset Class"),_T("lock"),WS_DISABLED, 0, 0,
                                                    CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);

есть подозрение, что "Tset Class" просто не существует - надо его создать и зарегистрировать.
а также указана в качестве входных параметров неинициализированная переменная(hInstance) - лучше уж 0 поставь.
Код

    SwitchDesktop(hdesk);

ты уже предусмотрел меры к возвращению на дефолтный десктоп? smile если их не будет, то выход будет только один - reset/poweroff.

Цитата(knut @  2.10.2006,  15:13 Найти цитируемый пост)
т.е мне нужно зделать lock как в win e(win+L) и я делаю так но  все равно не работает.

долог и тернист будет твой путь. общая схема(не исходник ни разу):
Код

//...
  hDefDesk = GetThreadDesktop(GetCurrentThreadId());
  hLockDesk = CreateDesktop(...);
  SwitchDesktop(hLockDesk);
  // тут для отладки можно сделать таймер, который переключит десктоп обратно
  CreateThread(.., LockThread, hLockDesk,...);
//...

void LockThread(void *hDesk)
{
  hInstance = GetModuleHandle(0);
  SetThreadDesktop(hDesk);
  // создание и регистрация оконного класса
  //...
  CreateWindow(...
  ShowWindow(...
  //цикл выборки сообщений
  //...
  SwitchDesktop(hDefDesk);
  CloseDesktop(hLockDesk);
}

на каждом этапе неплохо бы проверять возвращаемые api'шными функциями результаты для обработки ошибок.

Автор: knut 3.10.2006, 09:54
Задачу лока я решил так
Код


HDESK hdesk = GetThreadDesktop(GetCurrentThreadId());
    if(!hdesk)
    {
        _tprintf(_T("GetThreadDeskTop failed:/n"));
        return;
    } 
    HDESK MyDesk = CreateDesktop(_T("LockDesktop"),0,0,0,DESKTOP_CREATEWINDOW|DESKTOP_SWITCHDESKTOP,0);

    if(!MyDesk)
    {
        _tprintf(_T("CreateDesktop Faild:"));
        return;
    }

    SetThreadDesktop(MyDesk);
    if(!SwitchDesktop(MyDesk))
    {
        _tprintf(_T("SwitchDesktop Failed:"));
         CloseDesktop(MyDesk);
         return;
    }
    Sleep(5000);
    SwitchDesktop(MyDesk);

но это работает под Windows a под Win CE (для Smartfhone 2003 для Device Emulator а)соответственно не будет работать.Как посоветуете решить эту проблему.



Автор: Kirill89 17.10.2006, 08:41
Может быть я не точно понял вопрос, но для скрытия всех окон можно воспользоваться EnumWindows() тоесть получать хенделы всех окон, кроме окна программы и ShowWindow(HWND,SW_HIDE); тоесть скрывать их. В первый параметр EnumWindows даже вроде можно передать функцию ShowWindow напрямую
Код

HWND h; //все окна
HWND hwnd; ..окно прораммы
void hide(){
if(h!=hwnd){
ShowWindow(HWND,SW_HIDE);
}
}
h=EnumWindows(&hide,NULL);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)