Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];

Вниз

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

 
Анатолий   (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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.038 c
3-1093259863
ydv
2004-08-23 15:17
2004.09.19
Триггеры, старое и новое значение поля


1-1094201216
P@vel
2004-09-03 12:46
2004.09.19
TmemoryStream


1-1093963622
bang
2004-08-31 18:47
2004.09.19
showmessage


1-1094353730
Viper
2004-09-05 07:08
2004.09.19
TStringGrid


14-1093893470
able
2004-08-30 23:17
2004.09.19
Протокол XML-RPC





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский