Форум: "WinAPI";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
ВнизDesktops & WindowStations Найти похожие ветки
← →
alexrush (2003-02-15 12:00) [0]Доброго времени суток, господа Мастера.
Есть следующий код.\/ Все работает, кроме одного - при попытке переключения десктопа все время выбивает ошибку (Access Denied)
Подскажите, в чем проблема.
Код:
TForm1 = class(TForm)
private
_hDesktop :HDESK;
_hWndStanA :HWINSTA;
_hToken :DWORD;
_desktopSA :SECURITY_ATTRIBUTES;
_desktopSID :SECURITY_DESCRIPTOR;
_pDesktopSID :PSECURITYDESCRIPTOR;
.................
CONST szDesktopName = "R_ADM_DESKTOP"#0;
implementation
function TForm1.CreateDesktop: boolean;
var hOD:DWORD;
dwtemp:DWORD;
begin
result:=false;
ZeroMemory(@_DesktopSID,sizeof(_DesktopSID));
ZeroMemory(@_desktopSA,sizeof(_desktopSA));
_desktopSA.nLength:=sizeof(_desktopSA);
_desktopSA.bInheritHandle:=TRUE;
//------------------------------------------------------------
_hWndStanA:=CreateWindowStationA(@szDesktopName[1],
0,
WINSTA_ENUMDESKTOPS
or WINSTA_ACCESSCLIPBOARD
or WINSTA_READATTRIBUTES
or WINSTA_CREATEDESKTOP
or WINSTA_WRITEATTRIBUTES
or WINSTA_ACCESSGLOBALATOMS
or WINSTA_EXITWINDOWS
or WINSTA_ENUMERATE
or WINSTA_READSCREEN,
@_desktopSA);
if _hWndStanA=0
then begin
SystemErrorMsg("CreateWindowStationA");
exit;
end;
if not SetProcessWindowStation(_hWndStanA)
then begin
SystemErrorMsg("SetProcessWindowStation");
exit;
end;
//------------------------------------------------------------
_hDesktop:= Windows.CreateDesktopA(szDesktopName,
0,
0,
DF_ALLOWOTHERACCOUNTHOOK,
DESKTOP_CREATEMENU
or DESKTOP_CREATEWINDOW
or DESKTOP_ENUMERATE
or DESKTOP_HOOKCONTROL
or DESKTOP_JOURNALPLAYBACK
or DESKTOP_JOURNALRECORD
or DESKTOP_READOBJECTS
or DESKTOP_SWITCHDESKTOP
or DESKTOP_WRITEOBJECTS,
@_desktopSA);
if _hDesktop=0
then begin
SystemErrorMsg("CreateDesktopA");
exit;
end;
!!!! Здесь SwitchDesktop постоянно возвращает FALSE,
!!!! GetLastError = ERROR_ACCESS_DENIED
if not SwitchDesktop(_hDesktop)
then begin
SystemErrorMsg("SwitchDesktop");
exit;
end;{}
//------------------------------------------------------------
result:=true;
end;
← →
Набережных С. (2003-02-15 18:22) [1]Блин, какой к лешему ввод пользователя в неинтерактивной станции???!!!!!
← →
alexrush (2003-02-17 17:17) [2]>> Набережных С. >> В таком случае буду признателен, если объяснишь, что есть интерактивная и неинтерактивная станции.
А суть моей проблемы такова: полностью спрятать вывод дочерних графических программ, а ввод указывать программно (сообщениями). Возможно ли это вообще под NT4?
← →
Набережных С. (2003-02-17 18:55) [3]Я не мастак объясненять, лучше тебе почитать в MSDN или хотя бы SDK.
Вкратце так.
На старте система автоматом создает станцию WinSta0, она и является интерактивной и ее, и только ее, столы могут быть видимы пользователю и принимать от него ввод. После логина активным становится стол с именем Default. Вот в этой станции ты можешь создать свой стол, сделать его активным с помощью SwitchDesktop, подключить к нему поток, а потом уже в этом потоке создавать окна, переключать на них фокус ввода, рисовать, создавать дочернии и т.д. Если же его не активизировать, то можно делать все тоже самое, кроме переключения на него фокуса, и все это будет не видно пользователю. Т.е. в каждый момент активен только один стол и его можно выбирать функцией SwitchDesktop, но только в пределах станции WinSta0. Например, в системе всегда присутствуют еще 3 станции: для системных сервисов и созданные INETINFO.EXE и MSTASK.EXE, но их столы никогда не видимы и не могут стать таковыми.
>Возможно ли это вообще под NT4?
Честно говоря, не уверен, что понял суть проблемы, но, думаю, вполне возможно, если правильно спланировать архитектуру.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c