WIN7中如何做能让服务(允许服务与桌面交互已选)显示窗体(200)

  • 主题发起人 主题发起人 djf813
  • 开始时间 开始时间
D

djf813

Unregistered / Unconfirmed
GUEST, unregistred user!
看了一些资料,发现在Windows 7中无法显示窗体,只能做成C/S模式,通过命名管道,文件映射等通讯(在Windows 7中,操作系统服务的Session 0隔离,阻断了系统服务和用户桌面进程之间进行交互和通信的桥梁)。通过看MSDN写了如下代码function ShowMessage(lpszMessage: PChar; lpszTitle: PChar): DWORD;var dwSession, dwResponse: DWORD; hThisProcess: THandle;begin dwSession := WTSGetActiveConsoleSessionId; hThisProcess := GetCurrentProcess; dwResponse := 0; WTSSendMessage(WTS_CURRENT_SERVER_HANDLE, dwSession, lpszTitle, Length(lpszTitle)*SizeOf(Char), lpszMessage, Length(lpszMessage)*SizeOf(Char), 1, 0, &dwResponse, FALSE); Result := dwResponse;end;已经可以通过服务在桌面显示消息对话框,但我无法获得消息对话框的返回值,就是不知道用户点击了消息对话框的那个按钮,如何知道用户按了消息对话框那个按钮?下面是服务调用程序const cmd='C:/WINDOWS/system32/cmd.exe';//要运行的程序procedure ShowDlg(lpszMessage: PChar; lpszTitle: PChar);var bSuccess: Boolean; si: STARTUPINFO; pi: PROCESS_INFORMATION; dwSessionID: DWORD; hToken, hDuplicatedToken: THandle; lpEnvironment: Pointer; lpszClientPath: PChar;begin bSuccess := FALSE; // 进程信息 ZeroMemory(@si, sizeof(STARTUPINFO) ); si.cb := sizeof(si); Si.lpDesktop := PChar('Winsta0/Default'); //-- si.wShowWindow:=SW_SHOWNORMAL; //-- // 获得当前Session ID dwSessionID := WTSGetActiveConsoleSessionId; hToken := 0; // 获得当前Session的用户令牌 if WTSQueryUserToken(dwSessionID, @hToken) = FALSE then begin if not bSuccess then ShowMessage('无法创建复杂UI', '错误'); if hToken <> 0 then CloseHandle(hToken); Exit; end; // 复制令牌 hDuplicatedToken := 0; if DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, nil, SecurityIdentification, TokenPrimary, hDuplicatedToken) = FALSE then begin if not bSuccess then ShowMessage('无法创建复杂UI', '错误'); if hToken <> 0 then CloseHandle(hToken); if hDuplicatedToken <> 0 then CloseHandle(hDuplicatedToken); Exit; end; // 创建用户Session环境 lpEnvironment := nil; if CreateEnvironmentBlock(lpEnvironment, hDuplicatedToken, FALSE) = FALSE then begin if not bSuccess then ShowMessage('无法创建复杂UI', '错误'); if hToken <> 0 then CloseHandle(hToken); if hDuplicatedToken <> 0 then CloseHandle(hDuplicatedToken); if lpEnvironment <> nil then DestroyEnvironmentBlock(lpEnvironment); Exit; end; // 在复制的用户Session下执行应用程序,创建进程。 // 通过这个进程,就可以显示各种复杂的用户界面了 if CreateProcessAsUser(hDuplicatedToken, PChar(cmd), nil, nil, nil, FALSE, NORMAL_PRIORITY_CLASS, lpEnvironment, nil, si, pi) = FALSE then begin if not bSuccess then ShowMessage('无法创建复杂UI', '错误'); if hToken <> 0 then CloseHandle(hToken); if hDuplicatedToken <> 0 then CloseHandle(hDuplicatedToken); if lpEnvironment <> nil then DestroyEnvironmentBlock(lpEnvironment); Exit; end; CloseHandle(pi.hProcess); CloseHandle(pi.hThread); bSuccess := TRUE;end;可是到获得当前Session的用户令牌 WTSQueryUserToken(dwSessionID, @hToken)一直返回False,不知什么原因,请问如何解决?
 
是不是权限的问题?
 
DFW1001:你是怎么实现得?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
595
import
I
后退
顶部