Как вернуться на дефолтный рабочий стол?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Как вернуться на дефолтный рабочий стол?

Сообщение arthur2 » 12.01.2011 (Ср) 16:01

Пишу программу, которая запускает другую программу на новый рабочий стол. При малейшем косяке приходится перезагружаться, поскольку с нового рабочего стола никак не выбраться: доступно только сочетание win+L.

Написал маленькую програмулинку, которая по идее должна была бы возвращать меня на дефолтный стол в случае чего:
Код: Выделить всё
Sub main()
    Dim hDefault As Long
    hDefault = OpenDesktop("Default", 0, 0, 0)
    SwitchDesktop hDefault
    CloseDesktop hDefault
End Sub

Запускаю её, находясь на новом рабочем столе, по горячим клавишам ярлыка. Возврата не происходит. В чём косяк?
Артур
 
   

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Как вернуться на дефолтный рабочий стол?

Сообщение Twister » 12.01.2011 (Ср) 17:47

Необходимо проверить, открылся ли десктоп с помощью OpenDesktop.
А я все практикую лечение травами...

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как вернуться на дефолтный рабочий стол?

Сообщение arthur2 » 12.01.2011 (Ср) 18:00

Десктоп открылся. Мало того, если запустить возвращалку той программой, которая на новом столе, то всё работает. Значит, возвращалку нужно запускать как-то по-другому, а не из ярлыка хоткием. Но как?

Я в конце main поставим msgbox - после возврата на дефолтный стол вижу, что возвращалка запустилась. Но такое ощущение, что это произошло только в момент возвращения, будто за кулисами hotkey был отложен до того момента, пока я вернусь на дефолтный стол. Разве горячие клавиши работают не на уровне всей системы? Почему вообще возвращалка запустилась не на том столе, на котором я в этот момент находился, а на дефолтном?
Артур
 
   

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как вернуться на дефолтный рабочий стол?

Сообщение iGrok » 12.01.2011 (Ср) 18:25

arthur2 писал(а):Почему вообще возвращалка запустилась не на том столе, на котором я в этот момент находился, а на дефолтном?

Видимо потому, что хоткеи, заданные для ярлыка на рабочем столе, обрабатываются эксплорером, работающим в дефолтном раб. столе.
label:
cli
jmp label

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Как вернуться на дефолтный рабочий стол?

Сообщение Twister » 12.01.2011 (Ср) 20:34

Получите и распишитесь :)

Как всегда голый API. С вопросами welcome.
Вложения
Desktops.rar
(198.43 Кб) Скачиваний: 68
А я все практикую лечение травами...

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как вернуться на дефолтный рабочий стол?

Сообщение arthur2 » 12.01.2011 (Ср) 21:49

Экзешник сообщает, что 'Hotkeys is not installed', потом по хоткеям ничего не происходит :)

Сквозь паскаль мне всё-таки трудно продираться... а можно на си? :oops:
Артур
 
   

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Как вернуться на дефолтный рабочий стол?

Сообщение Antonariy » 12.01.2011 (Ср) 23:07

arthur2 писал(а):Экзешник сообщает, что 'Hotkeys is not installed', потом по хоткеям ничего не происходит :)

За них отвечает процесс hkcmd.exe
arthur2 писал(а):Сквозь паскаль мне всё-таки трудно продираться... а можно на си? :oops:
По-моему паскаль синтаксически таки ближе к вб, чем си, нет?
Лучший способ понять что-то самому — объяснить это другому.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как вернуться на дефолтный рабочий стол?

Сообщение arthur2 » 12.01.2011 (Ср) 23:15

Antonariy писал(а):По-моему паскаль синтаксически таки ближе к вб, чем си, нет?
Только паскаль я не знаю, а си - немного уже да :)
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как вернуться на дефолтный рабочий стол?

Сообщение arthur2 » 12.01.2011 (Ср) 23:23

Antonariy писал(а):За них отвечает процесс hkcmd.exe
Нет, это строка из кода примера. Судя по всему, хоткеи просто не зарегистрировались. Я по аналогии сделал RegisterHotKey - возвращался ноль, пока я не убрал флаг MOD_NOREPEAT. Но в этом исходнике я убрать флаг не могу, поскольку мне нечем перекомпилировать пример.

А вообще - я победил :) Но результат остался мне непонятен (точнее, не понятно, в чём принципиальная разница между тем, что было, и тем, что стало)

1. Создаю окно класса Static
2. Регистрирую на него hotkey
3. При срабатывании хоткея смотрю, какой стол активен
4. Если дефолтный, включаю второй и наоборот.

Осталось непонятно следующее: программка запущена, когда я на дефолтном столе. Она создаёт окно, а значит гвоздями прибита к этому столу. Но тем не менее, она легко переключает столы туда-сюда.

В чём тогда принципиальная разница между тем, что было, и тем, что стало? Если первый вариант не срабатывал из-за привязки проводника к дефолтному столу, то почему второй вариант работает, не смотря на точно такую же привязку самой возвращалки?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как вернуться на дефолтный рабочий стол?

Сообщение Хакер » 13.01.2011 (Чт) 2:54

arthur2 писал(а):Но тем не менее, она легко переключает столы туда-сюда.

Если ты (поток) создал окно окно, ты {не можешь себя привязать к другому десктопу}, а не {не можешь переключать десктопы}.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Как вернуться на дефолтный рабочий стол?

Сообщение Twister » 13.01.2011 (Чт) 7:50

arthur2
Но в этом исходнике я убрать флаг не могу, поскольку мне нечем перекомпилировать пример.
Можно было для этого воспользоваться HIEW'ом или OllyDbg ;)

RegisterHotKey - возвращался ноль, пока я не убрал флаг MOD_NOREPEAT
Это всё качество документации виновато. :) Там написано, что на w2k, wxp и wvista этот флаг не поддерживается, но нигде не сказано, что функция при этом не отработает. А я писал на семёрке, там было всё окей. Сейчас пересобрал и выложил новую версию в аттаче.

Хакер
Если ты (поток) создал окно окно, ты {не можешь себя привязать к другому десктопу}, а не {не можешь переключать десктопы}.

Документация по десктопам настолько кривая, что можно только диву даваться. То что ты сказал вроде как верно должно быть. Но на самом деле не совсем.

Во-первых. Нигде не написано, но SwitchDestop нифига нормально не отработает, если после неё не вызвать SetThreadDesktop, передав хендл целевого десктопа. По крайней мере у меня на 7-ке и ХР так и не вышло. Точнее так: на семерке десктоп переключается, но сообщение WM_HOTKEY перестают приходить окну (я тогда делал через очередь сообщений окну) и возвратиться назад получалось только после ребута. На XP заметно переключение, но тут же происходит возврат на исходный десктоп. Мистика какая-то :)

И я бы так и бился головой, если бы не распотрошил одну замечательную утилиту Руссиновича и не поглядел, как реализовано там. Получается что имея окно переключать десктопы мы нормально не сможем, ибо не отработает SetThreadDesktop. Можете, кстати, проверить у себя на системе: в аттаче несколько экзешников, один из которых после SwitchDestop не вызывает SetThreadDesktop. У вас корректно отработает?

Во-вторых. В комментариях к описанию SetThreadDesktop какой-то умник написал:
SetThreadDesktop will fail if the calling thread has ever had a window or hook on its current desktop.
Т.е. он утверждает, что если поток имел окно, то функция тоже не отработает. Но это не так! В том же аттаче еще один exe, который перед переключением десктопов выводит MessageBox. Как видите, всё прекрасно переключается. Меня удивляет, почему тот топик до сих пор не подвергся цензуре.

Вот тебе и документация...
Вложения
Desktops_2.rar
(186.69 Кб) Скачиваний: 79
А я все практикую лечение травами...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Как вернуться на дефолтный рабочий стол?

Сообщение Twister » 13.01.2011 (Чт) 8:15

Antonariy писал(а):
arthur2 писал(а):Экзешник сообщает, что 'Hotkeys is not installed', потом по хоткеям ничего не происходит :)

За них отвечает процесс hkcmd.exe
Нет. Хоткеи - объекты gui подсистемы (такие же как окна и хуки), за них отвечает win32k.sys и csrss.exe.
А hkcmd.exe это Intel Hotkey Command Module. Программа устанавливается с графическими картами Intel и обеспечивает поддержку различных горячих клавиш для быстрого изменения графических характеристик компьютера.
А я все практикую лечение травами...

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как вернуться на дефолтный рабочий стол?

Сообщение arthur2 » 13.01.2011 (Чт) 21:22

Twister писал(а):Можно было для этого воспользоваться HIEW'ом или OllyDbg
вместо этого я просто написал свой вариант :)
Twister писал(а):Получается что имея окно переключать десктопы мы нормально не сможем, ибо не отработает SetThreadDesktop. Можете, кстати, проверить у себя на системе: в аттаче несколько экзешников, один из которых после SwitchDestop не вызывает SetThreadDesktop. У вас корректно отработает?
Твой without_SetThreadDesktop не переключает на новый стол. Впрочем, видно, как новый стол мелькнул.
Но у меня в исходнике нет SetThreadDesktop и есть окно, и тем не менее всё нормально переключается :) Может быть, отличие в том, что я сам не создаю стол, а только открываю существующий?
Twister писал(а):В том же аттаче еще один exe, который перед переключением десктопов выводит MessageBox. Как видите, всё прекрасно переключается.
Та же история: стол только мелькнул.
А первый экзешник работает нормально. Кстати, ведь там тоже есть окно :)
Артур
 
   

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Как вернуться на дефолтный рабочий стол?

Сообщение Twister » 14.01.2011 (Пт) 7:16

Кстати, ведь там тоже есть окно
Окно не относится к тому потоку, который переключает десктопы.

А вот то, что вариант с MessageBox'ами не работает у тебя - еще более странно :) Какая система?

И да, покажи свой код. Желательно полностью и с исполняемым файлом.
А я все практикую лечение травами...

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как вернуться на дефолтный рабочий стол?

Сообщение arthur2 » 14.01.2011 (Пт) 7:32

win XP :)
Код: Выделить всё

#include <tchar.h>
#include <stdlib.h>
#include <windows.h>
#define MsgBox(prompt) MessageBox (0,_T(prompt),_T("Debug"),0)

HWND hwnd;
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
#define IDHOTKEY 0xbfff
void swDsk();
int x;                       
MSG msg;
hwnd = CreateWindow(
               _T("STATIC"), _T(""), WS_POPUP,
               0, 0, 10, 10, 0, 0,hInstance,0);
if (!RegisterHotKey(
      hwnd,IDHOTKEY,
      MOD_CONTROL,55))return 0;

    while (x=GetMessage(&msg, hwnd, 0, 0))
    {   
        if(x==-1)
        {
            return 0;
        }else
        {
            if ((msg.message==WM_HOTKEY)
                &&(msg.wParam==IDHOTKEY))
                swDsk();
        };
        DispatchMessage(&msg);
     }


}
//=================================================================

void swDsk()
{
  HDESK h=NULL;
  TCHAR *dsk;
  BOOL DefDesk();

  dsk=DefDesk()?_T("Default"):_T("NewDesk");
  h=OpenDesktop(dsk, 0,0,GENERIC_ALL );   
  if(h){int x=SwitchDesktop(h);CloseDesktop(h);};
 
}
//=================================================================

BOOL DefDesk()
{
HDESK hDesktop=OpenInputDesktop(0, 0, DESKTOP_READOBJECTS);
TCHAR *buf;
DWORD i;
if(hDesktop)
{
   buf=(TCHAR*)malloc(8*sizeof(TCHAR));
    GetUserObjectInformation(
      hDesktop,
      UOI_NAME,
      buf, 8, &i);

    CloseDesktop(hDesktop);
    i=_tcscmp(buf,_T("Default"));
    free(buf);
    return !i;
}
return 0;

Последний раз редактировалось arthur2 14.01.2011 (Пт) 12:35, всего редактировалось 2 раз(а).
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как вернуться на дефолтный рабочий стол?

Сообщение Хакер » 14.01.2011 (Пт) 7:47

Артур, тебе следует работать над стилем (глядя на твой исходник).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как вернуться на дефолтный рабочий стол?

Сообщение arthur2 » 14.01.2011 (Пт) 7:58

Угу :oops: Кстати, что на эту тему почитать?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как вернуться на дефолтный рабочий стол?

Сообщение Хакер » 14.01.2011 (Пт) 8:01

arthur2 писал(а):Угу :oops: Кстати, что на эту тему почитать?

Какие-нибудь нормальные исходники, например исходники винды WRK. Хуже что-нибудь опен-сорсное: над проектом работает куча людей, у всех свои предпочтения и вкусы, мнения. В результате получается каша из стилей и методик.

А потом сесть и напряженно подумать, выработав (приняв для себя) свой стиль.

Ну и вообще общие нормы. #define внутри функции — это вообще нечто.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как вернуться на дефолтный рабочий стол?

Сообщение arthur2 » 14.01.2011 (Пт) 8:06

Хакер писал(а):выработав (приняв для себя) свой стиль.
Хакер писал(а):Ну и вообще общие нормы. #define внутри функции — это вообще нечто.
А что плохого, если только внутри этой функции их использую?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как вернуться на дефолтный рабочий стол?

Сообщение Хакер » 14.01.2011 (Пт) 8:11

arthur2 писал(а):А что плохого, если только внутри этой функции их использую?

Тем, что нет никакой логики. Если делается глобальная препроц-константа, она помещается в начало либо вообще в h-файл. Если по какой-то причине нужно объявить внутрипроцедурный макрос, его принятно #undef-ить в конце этой процедуры.

А так получается глобальный макрос, который «виден» во всех функциях после строчке #define, но не «виден» до неё.

P.S. Советую воздержаться от продолжения этого обсуждения в этом разделе.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Как вернуться на дефолтный рабочий стол?

Сообщение pronto » 14.01.2011 (Пт) 8:47

arthur2 писал(а):Кстати, что на эту тему почитать?

Чистый код. ~6.3 MB
O, sancta simplicitas!

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Как вернуться на дефолтный рабочий стол?

Сообщение Twister » 14.01.2011 (Пт) 9:40

arthur2
Возможно, вся каша из-за того, что я открываю десктоп с минимальными правами, а ты со всеми. Так или иначе, хоть причины такого поведения мне и не ясны до конца, но я предпочту использовать методику Руссиновича. Уж очень авторитетный дядька :)

Хакер
Хуже что-нибудь опен-сорсное
А еще хуже что-нибудь с закрытым кодом. Ты исходники Касперского 6-го видел? :)
А я все практикую лечение травами...

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как вернуться на дефолтный рабочий стол?

Сообщение arthur2 » 15.01.2011 (Сб) 14:21

pronto Спасибо :)

Twister писал(а):но я предпочту использовать методику Руссиновича
Методика эта в чём заключается? в том, чтобы перед переключением вызвать SetThreadDesktop? Думаю, он вызывает её, просто чтобы на новом столе можно было показать своё окно :)
Артур
 
   


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 14

    TopList