Цитата(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);
|
ты уже предусмотрел меры к возвращению на дефолтный десктоп? если их не будет, то выход будет только один - 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'шными функциями результаты для обработки ошибок. |