Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.19;
Скачать: CL | DM;

Вниз

Автогенерация в текущем десктопе.   Найти похожие ветки 

 
Анатолий   (2004-08-09 13:18) [0]

Возникла такая проблема:

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

В моем проекте сразу после первого Begin пытаюсь сменить десктоп. Не прокатывает. Тогда я добавляю опцию {$APPTYPE CONSOLE} и тогда десктоп сменяется. Вероятно, если тип приложения GUI, то что-то автоматически генерится еще до моего кода. Я проверил на тестовом приложении, без единой формы или окна. На совсем пустом проекте - там был только код смены десктопа, и ситуация аналогичная. Если приложение не консольное, то новый десктоп не присваивается, консольное - присваивается.

Дело в том, что моя прогрмма не может быть консольным приложением. В ней создаются окна и диалоги и т.д. И появление черного окошка консоли мне ни к чему. Как же мне добиться, чтобы до того, как я сменю десктоп, ничего автоматически не прогенерилось в текущем десктопе?


 
Cobalt ©   (2004-08-09 14:01) [1]

>  На совсем пустом проекте - там был только код смены десктопа, и ситуация аналогичная. Если приложение не консольное, то новый десктоп не присваивается, консольное - присваивается.

А можно взглянуть на тестовый код?


 
Анатолий   (2004-08-09 14:43) [2]

> А можно взглянуть на тестовый код?

Ошибку возвращает GetLastError после функции SetThreadDesktop если {$APPTYPE CONSOLE} не включить. Иначе - без проблем.

program desktop;
// {$APPTYPE CONSOLE} // можно с ним или без него
uses
 SysUtils,
 Dialogs,
 Windows;

function MakeInteractive : Boolean;

 // доступ к оконной станции обнулением DACL
 function SetUserObjectFullAccess(hUserObject: THandle): Boolean;
 var
   Sd: PSecurity_Descriptor;
   Si: Security_Information;
 begin
   Sd := PSecurity_Descriptor(LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH));
   InitializeSecurityDescriptor(Sd, SECURITY_DESCRIPTOR_REVISION);
   SetSecurityDescriptorDacl(Sd, True, nil, False);
   Si := DACL_SECURITY_INFORMATION;
   Result := SetUserObjectSecurity(hUserObject, Si, Sd);
   LocalFree(HLOCAL(Sd));
 end;

begin
 Result := False;

 // Откр. интерактивную оконную станцию с правами WRITE_DAC
 hWinSta0x := OpenWindowStation("WinSta0", FALSE, WRITE_DAC);
 if hWinSta0x = 0 then
   begin
     CloseWindowStation(hWinSta0x);
     Exit;
   end;

 // Уст. права доступа
 if not SetUserObjectFullAccess(hWinSta0x) then
   begin
     CloseWindowStation(hWinSta0x);
     Exit;
   end;
 CloseWindowStation(hWinSta0x);

 // Откр. интерактивную оконную станцию с рабочими правами
 hWinSta0 := OpenWindowStation("WinSta0", FALSE, WINSTA_READSCREEN);
 if hWinSta0 = 0 then
   begin
     CloseWindowStation(hWinSta0);
     Exit;
   end;

 // Уст. интерактивную оконную станцию для приложения
 if not SetProcessWindowStation(hWinSta0) then
   begin
     CloseWindowStation(hWinSta0);
     Exit;
   end;
 CloseWindowStation(hWinSta0);

 // Откр. текущий интерактивный десктоп
 hDefault := OpenDesktop("Default", 0, FALSE,
                         DESKTOP_CREATEMENU or
                         DESKTOP_CREATEWINDOW or
                         DESKTOP_READOBJECTS or
                         DESKTOP_SWITCHDESKTOP or
                         DESKTOP_WRITEOBJECTS);
 if hDefault = 0 then
   Exit;

 // Уст. текущий интерактивный десктоп для приложения
 if not SetThreadDesktop(hDefault) then
   begin
     CloseDesktop(hDefault);
     Exit;
   end;

 Result := True;
end;

procedure CloseInteractive;
begin
 CloseDesktop(hDefault);
 CloseWindowStation(hWinSta0);
end;

begin
 if not MakeInteractive then
   Terminate;
 ShowMessage("OK");
 CloseInteractive;
end.


 
Анатолий   (2004-08-09 14:46) [3]

Эх, надо добавить перед 6 строкой с конца .. :)

var
 hWinSta0 : HWINSTA;
 hWinSta0x : HWINSTA;
 hDefault : HDESK;


 
Игорь Шевченко ©   (2004-08-09 14:56) [4]


>  Вероятно, если тип приложения GUI, то что-то автоматически
> генерится еще до моего кода


А посмотреть по секциям инициализации используемых unit"ов ?


 
Анатолий   (2004-08-09 15:46) [5]


> А посмотреть по секциям инициализации используемых unit"ов
> ?


Хм.. значит, если включена {$APPTYPE CONSOLE}, то unit"ы не инициализируются?


 
Игорь Шевченко ©   (2004-08-09 16:31) [6]


> Хм.. значит, если включена {$APPTYPE CONSOLE}, то unit"ы
> не инициализируются?


проверяют IsConsole при инициализации (например, в Forms.pas)?



Страницы: 1 вся ветка

Текущий архив: 2004.09.19;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.03 c
14-1093570865
Думкин
2004-08-27 05:41
2004.09.19
С днем рождения! 27 августа


10-1039664696
nik_d
2002-12-12 06:44
2004.09.19
Обратный вызов в MIDAS


4-1091325486
sensor
2004-08-01 05:58
2004.09.19
Нажать программно кнопку


4-1091597087
ERASER
2004-08-04 09:24
2004.09.19
Добавить пункт в меню Windows


14-1093767151
Пользователь
2004-08-29 12:12
2004.09.19
Delphi5 и Win ME