Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как перекрыть окна в Windows e 
:(
    Опции темы
knut
Дата 29.9.2006, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



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


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
GremlinProg
Дата 30.9.2006, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



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

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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
586
Дата 30.9.2006, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



или так:
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), 0);
PM   Вверх
knut
Дата 2.10.2006, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



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);
 



--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
GremlinProg
Дата 2.10.2006, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



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

    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
    );




--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
dumb
Дата 3.10.2006, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Цитата(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'шными функциями результаты для обработки ошибок.
PM MAIL   Вверх
knut
Дата 3.10.2006, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 7.2.2006

Репутация: нет
Всего: нет



Задачу лока я решил так
Код


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 а)соответственно не будет работать.Как посоветуете решить эту проблему.





--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
Kirill89
Дата 17.10.2006, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 17.10.2006
Где: Питер

Репутация: нет
Всего: 4



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

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



--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0508 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.