none
Переключение между рабочими столами C# RRS feed

  • Вопрос

  • _hMonitorDesctop = CreateDesktop("Desktop2", IntPtr.Zero, IntPtr.Zero, 0, 0x1ff, IntPtr.Zero);

    if (_hMonitorDesctop != IntPtr.Zero) { Marshal.GetLastWin32Error(); } if (!SetThreadDesktop(_hMonitorDesctop)) { Marshal.GetLastWin32Error(); } IntPtr hDesktop = OpenInputDesktop(1, false, 0x1ff); IntPtr hOriginalThread = GetThreadDesktop(GetCurrentThreadId()); if (!SwitchDesktop(_hMonitorDesctop)) { Marshal.GetLastWin32Error(); } Process.Start(path, name, password, Environment.MachineName.ToString());

    Создаю рабочий стол - запускаю там процесс.

    Далее задача следующая, при выполнении определенных действий - запущенный процесс прикрепить к первичному потоку,

    а второй рабочий стол закрыть, и убить процесс, который создавал рабочий стол.

    Делаю так

     RegistryKey temp = Registry.CurrentUser.CreateSubKey("M");
                temp = Registry.CurrentUser.OpenSubKey("M", true);
                temp.SetValue("1", hDesktop);
                temp.SetValue("2", hOriginalThread);
                temp.Close();
    //сохраняю id стола и потока
    
    
    Далее в запущенном приложении - реакция на событие
    RegistryKey rk = Registry.CurrentUser.OpenSubKey("M");
            IntPtr hDesktop = Program.OpenInputDesktop(1, false, 0x1ff);
                Program.SwitchDesktop((IntPtr) int.Parse(rk.GetValue("1").ToString()));//переключаемся на старый десктоп
                Program.SetThreadDesktop((IntPtr)int.Parse(rk.GetValue("2").ToString()));//аттачим поток к старому десктопу
                Program.CloseDesktop(hDesktop);//закрываем старый десктоп
                foreach (Process process in Process.GetProcessesByName("myfirstprocess"))
                    process.Kill();//убиваю приложение

    Задача в следующем - как вернуть всё на свои места, а процесс заставить работать уже в обчном рабочем столе. 

    Я первый раз здесь пишу, поэтому если что-то непонятно по вопросу - спрашивайте

    • Изменено zzz_ 13 апреля 2012 г. 13:30
    13 апреля 2012 г. 13:19

Ответы

  • Здравствуйте.

    Что именно должно вернуться назад и как? Помоему вы все правильно делаете - перед закрытием раб.стола производите смену его, потом привязку потока и закрываете. Должно работать.

    Вот здесь Блокировка SwitchDesktop описывается подобной ваша задача и последовательность действий таже.


    Для связи [mail]

    • Помечено в качестве ответа Abolmasov Dmitry 20 апреля 2012 г. 7:58
    17 апреля 2012 г. 12:53