С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/16: Рейтинг темы: голосов - 16, средняя оценка - 4.56
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748

Обращение к другому рабочему столу

20.10.2011, 16:47. Показов 3381. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую.
Знаете окошко Unlock Computer? Оно появляется после нажатия Ctrl + Alt + Del Enter. Окошко хорошее, да вот только одна проблемка - заслоняет оно фоту девушки прям по центру - не дело Решил его сдвинуть.
По простому FindWindow не получилось.
После выяснений узнал, что оно находится на другом рабочем столе - WinSta0Winlogon.
Притом, чтобы обратиться к этому рабочему столу необходимо запускать свое приложение как службу. Ну да ладно - не беда. Поставил nnCron и через него запустил. Но все равно, толка никакого. На рабочий стол другой переходить не хочет. Код следующий:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Sub Main()
 
Dim handle As Long
Dim WinSta As Long, Desktop As Long, STD As Long
WinSta = OpenWindowStation("Winsta0", False, GENERIC_ALL)
SetProcessWindowStation WinSta
Desktop = OpenDesktop("default", 0, False, GENERIC_ALL)
STD = SetThreadDesktop(Desktop)
If STD = 0 Then MsgBox "GLE: " & GetLastError
MsgBox "Desktop: " & Desktop ' <---
handle = FindWindow(vbNullString, "Unlock Computer")
If handle > 0 Then SetWindowPos handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE
MsgBox "Handle: " & handle
Open "C:123.log" For Append As #1
Print #1, CStr(WinSta)
Print #1, CStr(Desktop)
Print #1, CStr(handle)
Close #1
 
CloseWindowStation WinSta
CloseDesktop Desktop
 
MsgBox "done"
End Sub
Выеделенный MsgBox должен быть НЕ видем на текущем рабочем столе, а должен быть виден только после нажатия Ctrl + Alt + Del. Однако, виден он на текущем рабочем столе (WinSta0Default).
Аналогичная программа, написанная на C сидящим рядом со мной человеком работает без проблем:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# include <windows.h>
 
int WINAPI WinMain(HINSTANCE hInstance,
 
    HINSTANCE hPrevInstance,
 
    LPSTR lpCmdLine,
 
    int nCmdShow
 
)
 
{
 
      HWINSTA hWS = OpenWindowStation("Winsta0", FALSE, GENERIC_ALL);
 
      SetProcessWindowStation(hWS);
 
      HDESK hDT = OpenDesktop("Winlogon", 0, FALSE, GENERIC_ALL);
 
      SetThreadDesktop(hDT);
 
      MessageBox(0,"test","header",0); // <---
 
      return 0;
 
};
Выделенное собщение появляется там где надо, т.е. на другом рабочем столе.
Когда делаю проверку на ошибки, то вижу, что в STD (STD = SetThreadDesktop(Desktop)) кладется ноль, соответственно функция выполнилась неправильно, судя по MSDN (If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, call GetLastError).
Однако GetLastError тоже возвращает ноль!
В чем моя ошибка?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.10.2011, 16:47
Ответы с готовыми решениями:

Путь к рабочему столу
Есть ли какой-нибудь &quot;общий&quot; путь к рабочему столу. Я имею ввиду, что бы путь годился на любом компьютере, а то если я создам программу...

Путь к рабочему столу
Пишу курсовую и столкнулся с 2мя проблемами. Прога будет делать сортировку рабочего стола, но как его найти? Мой вариант: прога копируется...

Альтернатива рабочему столу
Вот задался идеей создать альтернативный рабочий стол и возникла масса вопросов. Первый стоил лиделать его на билдере или же лучше на...

8
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
20.10.2011, 17:00  [ТС]
Извиняюсь, опечатался.
Вместо Desktop = OpenDesktop("[bold]default[/bold] ", 0, False, GENERIC_ALL) на самом деле там Desktop = OpenDesktop("[bold]Winlogon[/bold] ", 0, False, GENERIC_ALL).
Это уже потом после неудачи просто тестировали.
0
1 / 1 / 0
Регистрация: 25.05.2008
Сообщений: 232
23.10.2011, 08:44
НЕмного не по теме ) Можно открыть девушку в фотошопе и сдвинуть ее чуть в право или влево )
0
Messir
23.10.2011, 12:56
Цитата Сообщение от DjinnWalker
НЕмного не по теме ) Можно открыть девушку в фотошопе и сдвинуть ее чуть в право или влево )
Неспортивно-то как...
Да и какие-нибудь важные части тела терять не хочется...
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
23.10.2011, 12:57  [ТС]
Цитата Сообщение от DjinnWalker
НЕмного не по теме ) Можно открыть девушку в фотошопе и сдвинуть ее чуть в право или влево )
Неее) Это ламерский выход) Программеры мы или кто? ))))

и так, еще немного размышлений. Хотел еще в пятницу запостить, да времени не было
Посидели мы часик с Comanche в аське и вот что поняли...
Во-первых, ошибка действительно есть, но VB ее НЕ видит (в GetLastError).
При помощи отладчика человек выловил, что ошибка появляется 170-я: 170 The requested resource is in use. ERROR_BUSY.
Стали рыть дальше. Нашли следующее...
"error code 170 means that your application still has opened windows/hooks on its previous desktop, a simple solution is to call SetThreadDesktop as early as possible, in the constructor of your app class, for example."
И были удивлены - как это так... В программе нет НИ ОДНОЙ формы, а написано про какие-то окна и хуки.
Думали, что может все-таки ошибка в правах доступа. Попробовали MAXIMUM_ALLOWED вместо GENERIC_ALL. Никакого результата.
Стали искать скрытые окна.... и нашли две штуки... VBMsoStdCompMgr и ThunderRT6Main.
После рытья в MSDN оказалось, что VB для любого проекта создает по два скрытых окна, необходимых для отлова виндовых сообщений: "VBFocusRT6 and VBMsoStdCompMgr are hWnds created by the Visual Basic runtime for Microsoft-proprietary Windows Messages related to the operation of the runtime. They cannot be removed, but receive very few messages anyways. ThunderRT6Main is the "parent" hWnd -- if a Visual Basic form existed, this hWnd would pass messages from the other two proprietary hWnds to the forms (and trap some that forms shouldn''t get). These three hWnds cannot be removed and do not provide any performance bottlenecks."
Кильнуть их нельзя, т.к. без них ничего работать не будет. На другой десктоп их тоже нельзя перенести.
В результате пришли к выводу, что на VB это можно сделать только путем мультитрединга, т.к. первый тред изначально является неподходящим, т.к. в нём изначально ("автоматом") уже есть те самые два скрытых окна.
Будем надеяться, что эта информация кому-нибудь пригодится

[italic]С уважением, Alexey Spirin & Comanche.[/italic]
0
2 / 2 / 1
Регистрация: 19.07.2007
Сообщений: 737
23.10.2011, 15:23
а флажок Unattended Execution не пробовали на своем экзешничке без формочек ставить?
0
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
23.10.2011, 16:04  [ТС]
Попробовал. Не помогает
0
2 / 2 / 1
Регистрация: 19.07.2007
Сообщений: 737
23.10.2011, 16:54
видно VB для таких низкоуровневых вещей не совсем подходит
0
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
23.10.2011, 17:14  [ТС]
ну по всей видимости да... )
Вот думаю может мультитредингом попробовтаь заняться в свободное время... )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.10.2011, 17:14
Помогаю со студенческими работами здесь

Доступ к Рабочему столу
Всем доброе время суток!!! Вот проблема я разрабатываю программу на VS C# и мне нужно узнать в путь в реестре для доступа к рабочему столу....

Путь к рабочему столу...
Как узнать путь к рабочему столу?

Подключением к удаленному рабочему столу
Всем привет! Весь день ломаю голову над данной проблемой: Есть домашний сервак под ОС 2008 R2, имеет всего 2 роли: Сервер приложений и...

Перемещение грида по рабочему столу
В гриде расположен рисунок и таймер, сам грид обтекает полностью по форме,я убрал рамку и фон формы, но как сделать ,чтоб грид перемещался...

Поиск пути к рабочему столу
Здравствуйте. Я просмотрел несколько тем на форуме с этой темой, но ни черта не понял. Может кто-нибудь показать, как можно найти путь к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru