你是指在service中showwindow吗?那需要取得当前的workstation和desktop后才可以用。 可以参考msdn,这里还有一段别人的程序: unit ServiceDesktop;interfacefunction InitServiceDesktop: boolean; procedure DoneServiceDeskTop;{$INCLUDE Config.inc}implementationuses Windows, SysUtils, Common;const DefaultWindowStation = 'WinSta0'; DefaultDesktop = 'Default'; var hwinstaSave: HWINSTA; hdeskSave: HDESK; hwinstaUser: HWINSTA; hdeskUser: HDESK;function InitServiceDesktop: boolean; var dwThreadId: DWORD; begin {$IFDEF DEBUG}CreateLog('InitServiceDesktop');{$ENDIF} dwThreadId := GetCurrentThreadID; // Ensure connection to service window station and desktop, and // save their handles. hwinstaSave := GetProcessWindowStation; hdeskSave := GetThreadDesktop(dwThreadId); hwinstaUser := OpenWindowStation(DefaultWindowStation, FALSE, MAXIMUM_ALLOWED); if hwinstaUser = 0 then begin {$IFDEF DEBUG}CreateLog('OpenWindowStation failed' + SysErrorMessage(GetLastError)){$ENDIF}; Result := false; exit; end; if not SetProcessWindowStation(hwinstaUser) then begin {$IFDEF DEBUG}CreateLog('SetProcessWindowStation failed'){$ENDIF}; Result := false; exit; end; hdeskUser := OpenDesktop(DefaultDesktop, 0, FALSE, MAXIMUM_ALLOWED); if hdeskUser = 0 then begin {$IFDEF DEBUG}CreateLog('OpenDesktop failed'){$ENDIF}; SetProcessWindowStation(hwinstaSave); CloseWindowStation(hwinstaUser); Result := false; exit; end; Result := SetThreadDesktop(hdeskUser); if not Result then {$IFDEF DEBUG}CreateLog('SetThreadDesktop' + SysErrorMessage(GetLastError)){$ENDIF}; end;procedure DoneServiceDeskTop; begin {$IFDEF DEBUG}CreateLog('DoneServiceDesktop');{$ENDIF} // Restore window station and desktop. SetThreadDesktop(hdeskSave); SetProcessWindowStation(hwinstaSave); if hwinstaUser <> 0 then CloseWindowStation(hwinstaUser); if hdeskUser <> 0 then CloseDesktop(hdeskUser); end;initialization InitServiceDesktop;finalization DoneServiceDesktop; end.
可以参考msdn,这里还有一段别人的程序:
unit ServiceDesktop;interfacefunction InitServiceDesktop: boolean;
procedure DoneServiceDeskTop;{$INCLUDE Config.inc}implementationuses
Windows, SysUtils, Common;const
DefaultWindowStation = 'WinSta0';
DefaultDesktop = 'Default';
var
hwinstaSave: HWINSTA;
hdeskSave: HDESK;
hwinstaUser: HWINSTA;
hdeskUser: HDESK;function InitServiceDesktop: boolean;
var
dwThreadId: DWORD;
begin
{$IFDEF DEBUG}CreateLog('InitServiceDesktop');{$ENDIF}
dwThreadId := GetCurrentThreadID;
// Ensure connection to service window station and desktop, and
// save their handles.
hwinstaSave := GetProcessWindowStation;
hdeskSave := GetThreadDesktop(dwThreadId);
hwinstaUser := OpenWindowStation(DefaultWindowStation, FALSE, MAXIMUM_ALLOWED);
if hwinstaUser = 0 then
begin
{$IFDEF DEBUG}CreateLog('OpenWindowStation failed' + SysErrorMessage(GetLastError)){$ENDIF};
Result := false;
exit;
end; if not SetProcessWindowStation(hwinstaUser) then
begin
{$IFDEF DEBUG}CreateLog('SetProcessWindowStation failed'){$ENDIF};
Result := false;
exit;
end; hdeskUser := OpenDesktop(DefaultDesktop, 0, FALSE, MAXIMUM_ALLOWED);
if hdeskUser = 0 then
begin
{$IFDEF DEBUG}CreateLog('OpenDesktop failed'){$ENDIF};
SetProcessWindowStation(hwinstaSave);
CloseWindowStation(hwinstaUser);
Result := false;
exit;
end;
Result := SetThreadDesktop(hdeskUser);
if not Result then
{$IFDEF DEBUG}CreateLog('SetThreadDesktop' + SysErrorMessage(GetLastError)){$ENDIF};
end;procedure DoneServiceDeskTop;
begin
{$IFDEF DEBUG}CreateLog('DoneServiceDesktop');{$ENDIF}
// Restore window station and desktop.
SetThreadDesktop(hdeskSave);
SetProcessWindowStation(hwinstaSave);
if hwinstaUser <> 0 then
CloseWindowStation(hwinstaUser);
if hdeskUser <> 0 then
CloseDesktop(hdeskUser);
end;initialization
InitServiceDesktop;finalization
DoneServiceDesktop;
end.
谢谢,不过你知道如何在NTSERVICE中创建进程,但同时不让创建的进程继承NTSERVICE的安全属性,比如可以在任务管理器中关闭创建的进程。
帮忙找一找,我急需!!先谢了!:)