hm Сделал десктоп, а вот окна на нём...

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

hm Сделал десктоп, а вот окна на нём...

Сообщение Опришник » 11.06.2005 (Сб) 20:57

1) Сделал десктоп
2) Переключился на него
...
А вот здесь проблема
Моя прога запущенна под десктопом Default(и соответственно все окна, которые я делаю - делаются на нём), а нужно сделать чтоб под десктопом имя_десктопа...
...
N) Закрыл все хандлы, ....

hm - это значит Help Me...
за любую полузную инф. заранее благодарен...
А здесь могла бы быть ваша реклама...)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.06.2005 (Сб) 22:48

SetThreadDesktop


Замечание: все окна одной нити должны быть в одном и том же десктопе.
Изображение

Опришник
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 09.01.2005 (Вс) 0:48
Откуда: localhost

Сообщение Опришник » 12.06.2005 (Вс) 13:27

The SetThreadDesktop function assigns a desktop to the calling thread. All subsequent operations on the desktop use the access rights granted to hDesktop.
А здесь могла бы быть ваша реклама...)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.06.2005 (Вс) 13:58

Опришник писал(а):
The SetThreadDesktop function assigns a desktop to the calling thread. All subsequent operations on the desktop use the access rights granted to hDesktop.

Что-то не так?
Изображение

Опришник
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 09.01.2005 (Вс) 0:48
Откуда: localhost

Сообщение Опришник » 12.06.2005 (Вс) 15:18

SetThreadDesktop - это не то(мне так кажется)
в эту функцию мы передаём манипулятор десктопа...но не как не манипулятор(или ещё что-нибудь) нити.
В мсдн есть пример в котором показано как сделать десктоп, а на нём MessageBox...
Там для этого используются функции *WindowStation...
а ещё RpcImpersonateClient и RpcRevertToSelf...
В общем с тем как сделать десктоп и показать его я разобрался:
Код: Выделить всё

    Dim hOriginalThread&, _
        hOriginalInput&, _
        hNewDesktop&
   
    hOriginalThread = GetThreadDesktop(GetCurrentThreadId)
    hOriginalInput = OpenInputDesktop(0, False, DESKTOP_SWITCHDESKTOP)
   
    hNewDesktop = CreateDesktop(имя_десктопа, 0, 0, 0, GENERIC_ALL, 0)
    If hNewDesktop Then
        Call SetThreadDesktop(hNewDesktop)
        Call SwitchDesktop(hNewDesktop)
    End If

А вот с остальным проблемы...

Так же можно сделать поток, и указать при создании какому десктопу он принадлежит...Но чё-та не хочет CreateProcess делать нормально поток(на VB)...
А здесь могла бы быть ваша реклама...)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.06.2005 (Вс) 20:47

Опришник писал(а):SetThreadDesktop - это не то(мне так кажется)
в эту функцию мы передаём манипулятор десктопа...но не как не манипулятор(или ещё что-нибудь) нити.

Тебе же нужно свои окна показывать на новом десктопе? Тогда проблем нет - SetThreadDesktop работает с текущей нитью.
Или чужие?
Опришник писал(а):В мсдн есть пример в котором показано как сделать десктоп, а на нём MessageBox...
Там для этого используются функции *WindowStation...
а ещё RpcImpersonateClient и RpcRevertToSelf...

WindowStation-ы то тут при чём? :-?

Опришник писал(а):В общем с тем как сделать десктоп и показать его я разобрался:
...
А вот с остальным проблемы...

Если SetThreadDesktop у тебя выполняется успешно (кстати, успешно?), то вновь созданные тобой окна попадут на новый десктоп.

Опришник писал(а):Так же можно сделать поток, и указать при создании какому десктопу он принадлежит...Но чё-та не хочет CreateProcess делать нормально поток(на VB)...

Ммм... А как именно ненормально CreateProcess делает поток?
Изображение

Опришник
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 09.01.2005 (Вс) 0:48
Откуда: localhost

Сообщение Опришник » 12.06.2005 (Вс) 22:47

SetThreadDesktop работает нормально...
CreateProcess выдаёт ошибку, хотя поток создаётся
А здесь могла бы быть ваша реклама...)

Опришник
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 09.01.2005 (Вс) 0:48
Откуда: localhost

Сообщение Опришник » 12.06.2005 (Вс) 23:08

tyomitch писал(а):WindowStation-ы то тут при чём? :-?

А я откуда знаю? :)
А здесь могла бы быть ваша реклама...)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.06.2005 (Вс) 23:26

Опришник писал(а):SetThreadDesktop работает нормально...
CreateProcess выдаёт ошибку, хотя поток создаётся

Какую именно хоть? :roll:
Изображение

Опришник
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 09.01.2005 (Вс) 0:48
Откуда: localhost

Сообщение Опришник » 12.06.2005 (Вс) 23:42

Какую не знаю, но происходит крушение, и кое кто спрашивает отправить ли мелкософту сведения об ошибке?
Ну чё отправлять? :D

А как на счёт окон, они у меня на десктопе имя_десктопа не появляются...И SetThreadDesktop работает правильно....
А здесь могла бы быть ваша реклама...)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.06.2005 (Вс) 23:54

Ничего не понимаю... Покажи свой код, что ли? В вышеприведённом CreateProcess нету вовсе.
Изображение

Опришник
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 09.01.2005 (Вс) 0:48
Откуда: localhost

Сообщение Опришник » 13.06.2005 (Пн) 0:38

tyomitch писал(а):Ничего не понимаю... Покажи свой код, что ли? В вышеприведённом CreateProcess нету вовсе.

Код: Выделить всё
Public Type THREAD_DATA
    hDesk As Long
    szDesktopName As String * 20
End Type

Public Function Thread_Desktop(ByVal ThreadFunc&, td As THREAD_DATA)
    Dim hOriginalThread&, _
        hOriginalInput, _
        hNewDesktop

    hOriginalThread = GetThreadDesktop(GetCurrentThreadId())
    hOriginalInput = OpenInputDesktop(0, False, DESKTOP_SWITCHDESKTOP)

    hNewDesktop = CreateDesktop(td.szDesktopName, 0, 0, 0, GENERIC_ALL, 0)
    If hNewDesktop Then
        Call SetThreadDesktop(hNewDesktop)
        Call SwitchDesktop(hNewDesktop)
   
        td.hDesk = hNewDesktop
        Dim tid&, _
            hThread&
           
        hThread = CreateThread(0, 0, ThreadFunc, td, 0, tid)
        If hThread Then
            Call WaitForSingleObject(hThread, INFINITE)
            Call CloseHandle(hThread)
        End If
   
        Call SwitchDesktop(hOriginalInput)
        Call SetThreadDesktop(hOriginalThread)
   
        Call CloseDesktop(hNewDesktop)
    End If
End Function
А здесь могла бы быть ваша реклама...)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.06.2005 (Пн) 14:20

До меня начинает доходить...
CreateProcess - это зашифрованное название CreateThread?
Откуда берётся ThreadFunc? Если это AddressOf VB-шная_процедура, то заработает только в p-code или в VB5.
Изображение

Опришник
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 09.01.2005 (Вс) 0:48
Откуда: localhost

Сообщение Опришник » 13.06.2005 (Пн) 20:25

Да, адрес с помощью AddressOf получаю....
Значит всё дело в функции...
А чё не так с функциями на VB6?
Последний раз редактировалось Опришник 13.06.2005 (Пн) 20:43, всего редактировалось 1 раз.
А здесь могла бы быть ваша реклама...)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.06.2005 (Пн) 20:41

Опришник писал(а):Да, адрес с помощью AddressOf получаю....
Значит всё дело в функции...

Нет, дело в рантайме VB :-)
CreateThread с ним несовместим.

Есть способ создать нить CreateThread-ом в ActiveX DLL, но у тебя похоже это не подходит...
Изображение

Опришник
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 09.01.2005 (Вс) 0:48
Откуда: localhost

Сообщение Опришник » 13.06.2005 (Пн) 21:04

мне что остаётся в p-code компилить?

tyomitch писал(а):CreateProcess - это зашифрованное название CreateThread?

Нет, с CreateProcess всё работает нормально...
Последний раз редактировалось Опришник 13.06.2005 (Пн) 21:41, всего редактировалось 1 раз.
А здесь могла бы быть ваша реклама...)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.06.2005 (Пн) 21:39

Почему же только, ещё есть VB5 и VB.net ;-)

А тебе действительно нужно показывать окна одного процесса на нескольких десктопах сразу? Может быть, создавать по процессу на десктоп?
Изображение

Опришник
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 09.01.2005 (Вс) 0:48
Откуда: localhost

Сообщение Опришник » 13.06.2005 (Пн) 21:52

tyomitch писал(а):Почему же только, ещё есть VB5 и VB.net ;-)

VB5 мне кажется старым(было дело VB1 юзал :)(не долго, с часа 2)), VB.NET я не долюбливаю, работает только с NT (хотя моя прога в другом и не будет работать), а ещё он не похож на прежний VB, больше похож на VisualC++(в частности mfc)
tyomitch писал(а):А тебе действительно нужно показывать окна одного процесса на нескольких десктопах сразу? Может быть, создавать по процессу на десктоп?

Нет мне только на одном десктопе процесс нужен причём желательно единственный...
А здесь могла бы быть ваша реклама...)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.06.2005 (Пн) 23:56

Опришник писал(а):
tyomitch писал(а):А тебе действительно нужно показывать окна одного процесса на нескольких десктопах сразу? Может быть, создавать по процессу на десктоп?

Нет мне только на одном десктопе процесс нужен причём желательно единственный...

Тогда зачем вторую нить создаёшь? :-)
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.06.2005 (Вт) 5:25

Примечание: VB .NET работает на 98. Это писать проги .NET на 98 нельзя, но работать они там будут...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Опришник
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 09.01.2005 (Вс) 0:48
Откуда: localhost

Сообщение Опришник » 14.06.2005 (Вт) 10:35

GSerg писал(а):Примечание: VB .NET работает на 98. Это писать проги .NET на 98 нельзя, но работать они там будут...

Конечно будут...
Причём все одинаково: Не найденна ... библиотека... Обратитесь ... за помощью, ...

tyomitch писал(а):
Опришник писал(а):
tyomitch писал(а):А тебе действительно нужно показывать окна одного процесса на нескольких десктопах сразу? Может быть, создавать по процессу на десктоп?

Нет мне только на одном десктопе процесс нужен причём желательно единственный...

Тогда зачем вторую нить создаёшь? :-)

Просто у меня до-сих пор не появляются мои окна на десктопе имя_десктопа, поэтому вопрос ещё актуален... :D

В p-code я не хочу компилить...А может всё-таки многопоточность возможна :cry: :?: Я подумал: а не всё равно ли винде на чём мы пишем прогу? И вообще я себе представляю многопоточность как очередь с приоритетами, где значения - это точки на которые нужно передовать управление... Если это так(кстати, так ли это?), то чё в vb-шном коде не так?
А здесь могла бы быть ваша реклама...)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.06.2005 (Вт) 11:33

Опришник писал(а):А может всё-таки многопоточность возможна :cry: :?:

В Standard EXE - нет.
Опришник писал(а):Я подумал: а не всё равно ли винде на чём мы пишем прогу? И вообще я себе представляю многопоточность как очередь с приоритетами, где значения - это точки на которые нужно передовать управление... Если это так(кстати, так ли это?), то чё в vb-шном коде не так?

Так, только значения - это "контексты" (набор всех регистров).
И Винде всё равно. А вот MSVBVM, такой-сякой, не допускает обращения с не созданной им нити. Потому что так он написан.
Соответственно, всё что ты смог бы сделать из нити, созданной по CreateThread - вызывать АПИ, объявленные в TLB. Не думаю, что тебе этого хватило бы.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.06.2005 (Вт) 14:59

Опришник писал(а):
tyomitch писал(а):
Опришник писал(а):
tyomitch писал(а):А тебе действительно нужно показывать окна одного процесса на нескольких десктопах сразу? Может быть, создавать по процессу на десктоп?

Нет мне только на одном десктопе процесс нужен причём желательно единственный...

Тогда зачем вторую нить создаёшь? :-)

Просто у меня до-сих пор не появляются мои окна на десктопе имя_десктопа, поэтому вопрос ещё актуален... :D

Есть такой файл в папке system32, называется ahui.exe ;-)
Поскольку даже для безоконного приложения VB6 создаёт окна ThunderRT6Main и VBFocusRT6, то перебраться на другой десктоп тебе не удастся :-(
Не знаю, что посоветовать - разве что перебираться в ActiveX DLL.
Изображение

Опришник
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 09.01.2005 (Вс) 0:48
Откуда: localhost

Сообщение Опришник » 14.06.2005 (Вт) 16:13

А чё проблема их destroy?
А здесь могла бы быть ваша реклама...)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.06.2005 (Вт) 18:59

Я бы не стал... Мало ли чего в MSVBVM на них завязано, для чего-то же они создаются? :roll:
А чё за прогу-то пишёшь хоть?
Изображение

Опришник
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 09.01.2005 (Вс) 0:48
Откуда: localhost

Сообщение Опришник » 14.06.2005 (Вт) 20:41

Поначалу я пишу слас CDesktop для интуитивно-понятной работы с десктопами...
Далее запланирован целый ряд прог, наиболее интересная это так называемый "сервер программ"(клиента он тоже включает), который запускает прогу на нужном компе, а мне даёт интерфейс для работы с этой прогой.
А здесь могла бы быть ваша реклама...)


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

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

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 96

    TopList