Форум: "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