Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как использовать свой десктоп, CreateDesktop 
:(
    Опции темы
h2o
Дата 13.2.2007, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: нет
Всего: 1



Как использовать свой десктоп? ни в drkb ни на форуме я ответа не нашел... может что пропустил?
в delphi в помощи по windows sdk отыскал эту функцию, но нифига у меня не получилось с ней поработать.
Однажду кто-то мне приводил пример использования этой функции тут на форуме (помойму это был Girder если не ошибаюсь...) но я не смог найти этой темы... всё-таки уже около года прошло:

Вообщем суть проблемы такая:
я хочу создать свой десктоп и чтобы моя программа в нем работала.
я сделал так: исходника нет под рукой, поэтому по памяти:
Код

var MyDesktop : HDESK;

procedure TForm.FormCreate(Sender: TObject);
begin
 MyDesktop:=CreateDesktop('My',nil,nil,DF_ALLOWOTHERACCOUNTHOOK,DESKTOP_CREATEWINDOW,nil); 
 MyDesktop:=OpenDesktop('My',0,false,DESKTOP_SWITCHDESKTOP);
 SWITCHDESKTOP(MyDesktop);  //нафига она нужна? если строка выше с параметром DESKTOP_SWITCHDESKTOP
end;

procedure TForm.FormClose(Sender: TObject);
begin
 CloseDesktop(MyDesktop);
end;

и получилась фигня! моя прога не отображается в новом десктопе. и десктоп не переключить, пришлось 2 раза комп перезагружать пока эксперементировал.

Мешает вот что: я незнаю:
1. когда создавать десктоп? в FormCreate? или где?
2. какие ещё функции кроме createdesktop нужны?
если я не делаю MyDesktop:=OpenDesktop('My',0,false,DESKTOP_SWITCHDESKTOP); то SWITCHDESKTOP(MyDesktop); не работает!
Как и в какой последовательности, с какими параметрами и какие функции при создании десктопа нужно делать?
3. Как сделать чтобы моя прога в созданном десктопе была а не в старом?
4. при выходе достаточно CloseDesktop(MyDesktop); или сначало нужно десктоп на DEFAULT сменить?


заранее спасибо, простите если просмотрел в форуме ответ на свой вопрос!
 

Это сообщение отредактировал(а) h2o - 13.2.2007, 11:00
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Yanis
Дата 13.2.2007, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



Цитата(h2o @  13.2.2007,  11:59 Найти цитируемый пост)
1. когда создавать десктоп? в FormCreate? или где?

В принципе не важно. Смотря, что требуется. Просто важно всё делать правильно.

Мне кажется код красноречивее меня будет smile:
Код
const
  sDesk = 'test_dsktp';
var
  hDesk: DWORD;
  si: TStartupInfo;
  pi: TProcessInformation;
begin
  ZeroMemory(@si, SizeOf(si));
  si.cb := SizeOf(si);

  hDesk := CreateDesktop(sDesk, nil, nil, DF_ALLOWOTHERACCOUNTHOOK,
                         DESKTOP_CREATEWINDOW or DESKTOP_SWITCHDESKTOP, nil);

  with si do
    begin
      lpDesktop := sDesk;
      dwFlags := STARTF_USESHOWWINDOW;
      wShowWindow := SW_MAXIMIZE;
    end;

  CreateProcess(nil, 'notepad.exe', nil, nil, False, CREATE_DEFAULT_ERROR_MODE, nil,
                nil, si, pi);
  CloseHandle(pi.hThread);

  SwitchDesktop(hDesk);
  while WaitForSingleObject(pi.hProcess, 100) = WAIT_TIMEOUT do
    Application.ProcessMessages;
  CloseDesktop(hDesk);
end;


Это сообщение отредактировал(а) Yanis - 13.2.2007, 15:08


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
h2o
Дата 13.2.2007, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: нет
Всего: 1



дак чтобы мне запустить свою программу в новом десктопе мне нужно 2ю писать, которая создаст десктоп, запустит мою прогу, закроет её и сменит десктоп?

Код

  CreateProcess(nil, 'notepad.exe', nil, nil, False, CREATE_DEFAULT_ERROR_MODE, nil,
                nil, si, pi);
  CloseHandle(pi.hThread);

  SwitchDesktop(hDesk);
  while WaitForSingleObject(pi.hProcess, 100) = WAIT_TIMEOUT do
    Application.ProcessMessages;


я хочу чтобы программа в которой я создаю новый десктоп в этом дестопе и отображалась

что-то дописать нужно?
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Yanis
Дата 13.2.2007, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



Цитата(h2o @  13.2.2007,  17:24 Найти цитируемый пост)
я хочу чтобы программа в которой я создаю новый десктоп в этом дестопе и отображалась

Этого сделать нельзя.
Возможно, если назначить треду другой десктоп и из него создать окно, то это сработает smile


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
h2o
Дата 13.2.2007, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: нет
Всего: 1



ладно, спасибо
Yanis
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
bems
Дата 14.2.2007, 03:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



SetThreadDesktop
но работает только если у твоего треда нет окон и хуков на его текущем десктопе. Поэтому чтобы быть полностью уверенным вызывай его из секции инициализации модуля, а модуль поставь первым в секции uses проекта


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Yanis
Дата 14.2.2007, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



Цитата(bems @  14.2.2007,  04:13 Найти цитируемый пост)
SetThreadDesktop

В самом начале обсуждения пробовал её использовать, но выяснилось что существующее окно туда не загнать. Можно только создать новое.....

Цитата(bems @  14.2.2007,  04:13 Найти цитируемый пост)
но работает только если у твоего треда нет окон и хуков на его текущем десктопе. Поэтому чтобы быть полностью уверенным вызывай его из секции инициализации модуля, а модуль поставь первым в секции uses проекта 

Но что-то у меня не получилось. Ты сам пробовал? Дай примерчик, а то у меня могла криворукость включиться в ненужный момент smile


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
h2o
Дата 14.2.2007, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: нет
Всего: 1



а я сделал по-другому:

написал прогу которую я хочу запустить в новом десктопе
создал новый бесформенный малюсенький проект (около 100 кб) проект, включил .ехе своей проги в ресурсы. при старте проги, извлекаю ресурсы и при помощи кода Yanis запускаю.

прекрасно работает, ну вот только программа увеличилась на 100 кб, хотя это не критично.

если вдруг кому интересно код могу сюда загнать
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
bems
Дата 15.2.2007, 05:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Цитата(Yanis @  14.2.2007,  10:44 Найти цитируемый пост)
 Ты сам пробовал? Дай примерчик,

если получится - отпишусь
Цитата(h2o @  14.2.2007,  14:29 Найти цитируемый пост)
новый бесформенный малюсенький проект (около 100 кб)
если только для запуска нового процесса - то 16 кб отсилы
Цитата(h2o @  14.2.2007,  14:29 Найти цитируемый пост)
включил .ехе своей проги в ресурсы
тоже хрень
Цитата(h2o @  14.2.2007,  14:29 Найти цитируемый пост)
если вдруг кому интересно код могу сюда загнать 
тривиально и с оверхедами. вряд ли кому-то будет интересно. попробуй из одного EXE. 
И я тоже попробую...



--------------------
Обижено школьников: 8
PM MAIL   Вверх
h2o
Дата 15.2.2007, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: нет
Всего: 1



bems 

Цитата

Цитата(h2o @  14.2.2007,  14:29 ) 
новый бесформенный малюсенький проект (около 100 кб) 

если только для запуска нового процесса - то 16 кб отсилы

это как у тебя 16 кб получается? у меня меньше 100 не получилось уменьшить...
у меня в uses почти ничего и нет, есть только windows, classes, types которые дают 100 кб.
ты как 16 кб получил?

Цитата

Цитата(h2o @  14.2.2007,  14:29 ) 
включил .ехе своей проги в ресурсы 

тоже хрень

зато быстро, просто и понятно и работает 100%


Цитата

попробуй из одного EXE. 

пробовал, но другими методами, и у меня нифига не получилось... ещё с SetThreadDesktop попробую
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
MetalFan
Дата 15.2.2007, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



h2o, а зачем тебе classes???
c Windows и Types у меня в D6 - 9 кб...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
h2o
Дата 15.2.2007, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: нет
Всего: 1



MetalFan  там помойму что-то нужное для кода Yanis
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Yanis
Дата 16.2.2007, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



Цитата(h2o @  15.2.2007,  18:13 Найти цитируемый пост)
MetalFan  там помойму что-то нужное для кода Yanis

Не надо меня впутывать в ваши разборки smile
К слову, у меня проект выходит на 10 KB (Turbo Delphi + UPX 2.9). smile 
Код
program Project1;

uses Windows;

const
  sDesk = 'test_dsktp';
var
  hDesk: DWORD;
  si: TStartupInfo;
  pi: TProcessInformation;
begin
  ZeroMemory(@si, SizeOf(si));
  si.cb := SizeOf(si);

  hDesk := CreateDesktop(sDesk, nil, nil, DF_ALLOWOTHERACCOUNTHOOK,
                         DESKTOP_CREATEWINDOW or DESKTOP_SWITCHDESKTOP, nil);

  with si do
    begin
      lpDesktop := sDesk;
      dwFlags := STARTF_USESHOWWINDOW;
      wShowWindow := SW_MAXIMIZE;
    end;

  CreateProcess(nil, 'notepad.exe', nil, nil, False, CREATE_DEFAULT_ERROR_MODE, nil,
                nil, si, pi);
  CloseHandle(pi.hThread);

  SwitchDesktop(hDesk);
  WaitForSingleObject(pi.hProcess, INFINITE);
  CloseDesktop(hDesk);
end.


Добавлено @ 09:38 
Не хочу развивать тему на то как сделать супер маленький исполняемый файл на Delphi. Да и 100 KB это не так страшно.

h2o
Если нужен мини размер, то напиши запускалку на ассемблере и запакуй её exe-пакером.

Это сообщение отредактировал(а) Yanis - 16.2.2007, 09:42


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
h2o
Дата 16.2.2007, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: нет
Всего: 1



Yanis а у меня D7 без всяких паков, и только лишь uses Windows; не прокатывает!
 ну это фигня!

главное решить проблему чтобы своя программа запускалась в созданном десктопе
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
bems
Дата 17.2.2007, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Цитата(h2o @  15.2.2007,  09:16 Найти цитируемый пост)
classes, types 
зачем они тебе?

Цитата(MetalFan @  15.2.2007,  09:59 Найти цитируемый пост)
c Windows и Types у меня в D6 - 9 кб... 
это екзешник? в шестерке обычно больше... если меньше, то наверное это ДЛЛ

Цитата(Yanis @  16.2.2007,  09:37 Найти цитируемый пост)
К слову, у меня проект выходит на 10 KB (Turbo Delphi + UPX 2.9).  
ты UPX сюда не путай, это не в щет. Вопрос не в объеме на диске, а в количестве кода.

h2o, попробуй использовать один екзешник в обоих ролях. Как стартер пусть он работает по дефолту, а как то что стартуют - в с лучае если есть какой-то специфический параметр командной строки. (Идея в том чтобы запускать самому себя, но с параметрами, которые позволят в начале dpr-файла определить эту ситуацию)


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0887 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.