PDA

Ver la Versión Completa : servicio windows que interaccione con el escritorio con usuario logueado


derteo
11-01-2006, 08:44:08
Estoy desarrollando un servicio de windows con Delphi. El servicio se debe iniciar con una cuenta de usuario(no con una cuenta local)y debe poder interactuar con el escritorio de la máquina en la que se está ejecutando.
Lo que hago es cambiar la estación y el escritorio del servicio por la estación winSta0 y el escritorio Default. De esta manera consigo visualizar las ventanas del proceso word que lanzo, estas ventanas se visualizan incorrectamente, seguramente no se refrescan.
A continuación os pongo el código en delphi q utilizo.
GetDesktopwindow();
hwinstaSave := GetProcessWindowStation();
dwThreadId := GetCurrentThreadId();
hdeskSave := GetThreadDesktop(dwThreadId);
station := 'WinSta0';
desktop := 'Default';

StationWideCharPtr := Addr(station[1]);
DeskWideCharPtr := Addr(desktop[1]);

hwinstaUser := OpenWindowStationW(StationWideCharPtr,
false,MAXIMUM_ALLOWED);

SetProcessWindowStation(hwinstaUser);

hdeskUser := OpenDesktopW(DeskWideCharPtr, 0, false, MAXIMUM_ALLOWED);
SetThreadDesktop(hdeskUser);

HERE I DO THE WORD PROCESS

SetThreadDesktop(hdeskSave);
SetProcessWindowStation(hwinstaSave);
CloseDesktop(hdeskUser);
CloseWindowStation(hwinstaUser);
Alguna idea?

delphi.com.ar
11-01-2006, 14:01:15
No entiendo cuál es el problema.... ¿Quieres que el servicio no precisamente se tenga que crear con el usuario local?

derteo
11-01-2006, 14:49:10
Uno de los requisitos del servicio es que debe funcionar con una cuenta de usuario, no con la cuenta local. Si funciona con la cuenta local, marcando el chekbox de interacción con el escritorio, la interacción se haría correctamente.

El servicio debe crear un proceso Word, aqui surge el problema(no se visualizan correctamente las ventanas de word). Con el código que puse en el mensaje anterior consigo que se visualicen las ventanas pero lo hacen de una forma incorrecta.

He comprobado que si :
- se creo manualmente un proceso word
- ejecuto el servicio

entonces las ventanas de word usadas por el servicio se muestran correctamente.

La única diferencia que detecté entre las ventanas abiertas usando el servicio y las que abro manualmante es la siguiente:
- las clases de las ventanas word son diferentes o eso creo. Las ventanas que se crean manualmente, lo hacen con la clase OpusApp

OpusApp = Es el nombre de la class Windows de todos los MS-Word
http://www.lawebdelprogramador.com/news/mostrar_new.php?id=73&texto=Power+Builder&n1=299071&n2=1&n3=0&n4=0&n5=0&n6=0&n7=0&n8=0&n9=0&n0=0


En cambio las ventanas que crea el servicio son GHost. Qué indicará GHOSt?



Estoy usando delphi 7 y word 2003.

delphi.com.ar
11-01-2006, 15:11:35
Ahora si...
¿Probaste jugar con el parámetro dwDesiredAccess de OpenDesktop?.. Lo estas pasando en 0, y aparentemente no tendrías acceso a crear ventanas (el proceso local no los creados).
¿Cómo creas el proceso de Word?.. no lo crearás como inherited?

derteo
11-01-2006, 15:52:44
EL proceso word lo creé de dos formas, obteniendo el mismo reusltado:
1.
word := TWordApplication.Create(self);
word.AutoConnect := False; //más adelante realizo la conexion
word.AutoQuit := False; //al final salimos con la instruccion QUIT
word.ConnectKind := ckRunningOrNew;
word.Connect;
word.WindowState := wdWindowStateNormal;
word.Visible := true;
....
....

2.
try
try
G_objWord := GetActiveOleObject('Word.Application');
except
on e:exception do begin
Log_GrabarLog('WARNING: No existe un proceso Word abierto :' + e.Message);
G_objWord := CreateOleObject('Word.Application');
Log_GrabarLog('INFO: Se ha creado un proceso Word');
end;
end;
//lo muestra
G_objWord.Visible := True;
//lo minimiza.
G_objWord.WindowState := 2;


comprobé los permisos con opendesktop y sigue igual.

Seguiré probando.