经典的截屏程序片断,正常情况没问题的。但我的程序是通过系统服务间接启动的(ShellExecute()),
这时程序显示为 SYSTEM,而不是Administrator所有。截屏却是白色的,不再是当前桌面上的彩色图像。
求解!
这时程序显示为 SYSTEM,而不是Administrator所有。截屏却是白色的,不再是当前桌面上的彩色图像。
求解!
解决方案 »
- ShockwaveFlash1播flash循環,WindowsMediaPlayer1播movie循環
- (300求助,急)如何动态创建TreeView与文件目前对接
- 急急急!!!公司要我开发这样一套系统,大家给点意见!!!!
- 请教各位高手:怎样使用SPCOMM将一个字符串发送出去呀!!!!
- 程序长时间工作的问题,工作一段时间以后系统就认为我的程序不响应了,动一下就有好了
- 如何在程序中检查远程WEB服务器是否可以访问?
- 请教reportbuild报表格式问题
- 请教从字符到ANSII的转换的方法
- 怎么画icon?
- query和TABLE的区别?
- 哪里能够下到可以正确安装的GLScene控件啊?
- 搜狗拼音打字,程序就崩溃
_TOKEN_TYPE = (TokenTypePad0, TokenPrimary, TokenImpersonation);
TOKEN_TYPE = _TOKEN_TYPE;
PTOKEN_TYPE = ^TOKEN_TYPE;
TTokenType = TOKEN_TYPE;
PTokenType = PTOKEN_TYPE; _SECURITY_IMPERSONATION_LEVEL = (SecurityAnonymous, SecurityIdentification,
SecurityImpersonation, SecurityDelegation);
SECURITY_IMPERSONATION_LEVEL = _SECURITY_IMPERSONATION_LEVEL;
PSECURITY_IMPERSONATION_LEVEL = ^SECURITY_IMPERSONATION_LEVEL;
TSecurityImpersonationLevel = SECURITY_IMPERSONATION_LEVEL;
PSecurityImpersonationLevel = PSECURITY_IMPERSONATION_LEVEL;
function SessionLogon():Boolean;
var
dwSessionId: DWORD;
FhToken: HANDLE ;
FhTokenDup: HANDLE ;
begin
Result:=False;
dwSessionId := lpWTSGetActiveConsoleSessionId();
if(lpWTSQueryUserToken(dwSessionId, FhToken))then
begin
if(lpDuplicateTokenEx (FhToken, MAXIMUM_ALLOWED, nil, SecurityIdentification, TokenPrimary, FhTokenDup))then
begin
if(lpImpersonateLoggedOnUser (FhTokenDup))then
begin
Result := TRUE;
end
end
end;
end;在你启动时调用,或者将要调用截屏功能函数时调用,结束时lpRevertToSelf,
相关函数的定义请查找jedi文件就行了,或者在网上找
那段代码就是先复制当前的活动会话的用户令牌,也就是admin的令牌,
再调用ImpersonateLoggedOnUser来使system用户暂时模拟admin用户,
实际上ImpersonateLoggedOnUser是在很多远程控制程序或者黑客程序都是用来提权的关键API。
这个贴子才是成功的希望!
{
HWINSTA hwinsta=OpenWindowStation("WINSTA0",false,MAXIMUM_ALLOWED);
SetProcessWindowStation(hwinsta);
HDESK hdesk=OpenDesktop("DEFAULT",0,false,MAXIMUM_ALLOWED);
SetThreadDesktop(hdesk);
}
bool SaveDesktop(TStream *fs,int q)
{ // 保存桌面到文件中
bool result=true;
setDesktop(); // 新增的
RECT r;
HWND d0=GetDesktopWindow();
GetWindowRect(d0,&r);
TCanvas *Canvas0=new TCanvas;
Canvas0->Handle=GetDC(d0);
Graphics::TBitmap *b=new Graphics::TBitmap();
b->Height=r.bottom;
b->Width=r.right;
b->Canvas->CopyRect(r,Canvas0,r);
TJPEGImage *j=new TJPEGImage();
j->CompressionQuality=q; // 图象质量 1-100
j->Assign(b);
try
{
j->SaveToStream(fs);
}
catch(...)
{
result=false;
}
delete j;
delete b;
delete Canvas0;
return(result);
}
就是不成
昨天试了一天,未成,今上午莫名其妙成了!也没改源程序,可能机器重启了,
可能与卸了一次服务有关。截屏一下成功了!我竟然不相信自已的眼睛了。
为了使后面的人不重复我的费事过程,把源码贴出,积德呀:)。
void setDesktop() // 切换到用户桌面
{
char pvInfo[128]= { 0 };
DWORD dwLen=0;
HDESK hActiveDesktop=OpenInputDesktop(DF_ALLOWOTHERACCOUNTHOOK,false,MAXIMUM_ALLOWED);
GetUserObjectInformation(hActiveDesktop,UOI_NAME,pvInfo,sizeof(pvInfo),&dwLen);
CloseDesktop(hActiveDesktop);
HWINSTA m_hwinsta=OpenWindowStation("WINSTA0",false,MAXIMUM_ALLOWED);
SetProcessWindowStation(m_hwinsta);
HDESK m_hdesk=OpenDesktop(pvInfo,0,false,MAXIMUM_ALLOWED);
SetThreadDesktop(m_hdesk);
}
void SaveDesktop(TStream *fs,int q) // 保存桌面jpg到流中 图象质量q%
{
setDesktop(); // 切换到用户桌面
RECT r;
HWND d0=GetDesktopWindow();
GetWindowRect(d0,&r);
TCanvas *Canvas0=new TCanvas;
Canvas0->Handle=GetDC(d0); Graphics::TBitmap *b=new Graphics::TBitmap();
b->Height=r.bottom;
b->Width=r.right;
b->Canvas->CopyRect(r,Canvas0,r); TJPEGImage *j=new TJPEGImage();
j->CompressionQuality=q; // 图象质量 1-100%
j->Assign(b);
try
{
j->SaveToStream(fs);
}
catch(...)
{
}
delete j;
delete b;
delete Canvas0;
}
就这么一点点长,费了我一个星期,搜的许多旧贴子,许多人遇到同样的苦恼。