Delphi的TService的輸入桌面切換(服务程序)(windows登录界面如何截图)(使用了OpenDesktop和GetThreadDesktop等API)
dfm:
object CopyDeskService: TCopyDeskService
OldCreateOrder = False
OnCreate = ServiceCreate
OnDestroy = ServiceDestroy
AllowPause = False
DisplayName = 'Copy Desk Service'
Interactive = True
Left = 192
Top = 107
Height = 150
Width = 215
end
pas:
unit Main;
interface
uses
Windows, SysUtils, Classes, Graphics, SvcMgr;
type
TCopyThread = class(TThread)
private
FIndex: DWORD;
FScrBmp: TBitmap;
protected
procedure Execute; override;
public
constructor Create; reintroduce;
destructor Destroy; override;
end;
TCopyDeskService = class(TService)
procedure ServiceCreate(Sender: TObject);
procedure ServiceDestroy(Sender: TObject);
private
FCopyThread: TCopyThread;
public
function GetServiceController: TServiceController; override;
end;
var
CopyDeskService: TCopyDeskService;
implementation
{$R *.DFM}
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
CopyDeskService.Controller(CtrlCode);
end;
function TCopyDeskService.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure TCopyDeskService.ServiceCreate(Sender: TObject);
begin
FCopyThread := TCopyThread.Create;
end;
procedure TCopyDeskService.ServiceDestroy(Sender: TObject);
begin
FCopyThread.Terminate;
end;
function SelectHDESK(HNewDesk: HDESK): Boolean; stdcall;
var
HOldDesk: HDESK;
dwDummy: DWORD;
sName: array[0..255] of Char;
begin
Result := False;
HOldDesk := GetThreadDesktop(GetCurrentThreadId);
if (not GetUserObjectInformation(HNewDesk, UOI_NAME, @sName[0], 256, dwDummy)) then
begin
OutputDebugString('GetUserObjectInformation Failed.');
Exit;
end;
if (not SetThreadDesktop(HNewDesk)) then
begin
OutputDebugString('SetThreadDesktop Failed.');
Exit;
end;
if (not CloseDesktop(HOldDesk)) then
begin
OutputDebugString('CloseDesktop Failed.');
Exit;
end;
Result := True;
end;
function SelectDesktop(pName: PChar): Boolean; stdcall;
var
HDesktop: HDESK;
begin
Result := False;
if Assigned(pName) then
HDesktop := OpenDesktop(pName, 0, False,
DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or
DESKTOP_ENUMERATE or DESKTOP_HOOKCONTROL or
DESKTOP_WRITEOBJECTS or DESKTOP_READOBJECTS or
DESKTOP_SWITCHDESKTOP or GENERIC_WRITE)
else
HDesktop := OpenInputDesktop(0, False,
DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or
DESKTOP_ENUMERATE or DESKTOP_HOOKCONTROL or
DESKTOP_WRITEOBJECTS or DESKTOP_READOBJECTS or
DESKTOP_SWITCHDESKTOP or GENERIC_WRITE);
if (HDesktop = 0) then
begin
OutputDebugString(PChar('Get Desktop Failed: ' + IntToStr(GetLastError)));
Exit;
end;
Result := SelectHDESK(HDesktop);
end;
function InputDesktopSelected: Boolean; stdcall;
var
HThdDesk: HDESK;
HInpDesk: HDESK;
dwError: DWORD;
dwDummy: DWORD;
sThdName: array[0..255] of Char;
sInpName: array[0..255] of Char;
begin
Result := False;
HThdDesk := GetThreadDesktop(GetCurrentThreadId);
HInpDesk := OpenInputDesktop(0, False,
DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or
DESKTOP_ENUMERATE or DESKTOP_HOOKCONTROL or
DESKTOP_WRITEOBJECTS or DESKTOP_READOBJECTS or
DESKTOP_SWITCHDESKTOP);
if (HInpDesk = 0) then
begin
OutputDebugString('OpenInputDesktop Failed.');
dwError := GetLastError;
Result := (dwError = 170);
Exit;
end;
if (not GetUserObjectInformation(HThdDesk, UOI_NAME, @sThdName[0], 256, dwDummy)) then
begin
OutputDebugString('GetUserObjectInformation HThdDesk Failed.');
CloseDesktop(HInpDesk);
Exit;
end;
if (not GetUserObjectInformation(HInpDesk, UOI_NAME, @sInpName[0], 256, dwDummy)) then
begin
OutputDebugString('GetUserObjectInformation HInpDesk Failed.');
CloseDesktop(HInpDesk);
Exit;
end;
CloseDesktop(HInpDesk);
Result := (lstrcmp(sThdName, sInpName) = 0);
end;
procedure CopyScreen(Bmp: TBitmap; out Index: DWORD);
var
DC: HDC;
begin
DC := GetDC(0);
Bmp.Width := GetSystemMetrics(SM_CXSCREEN);
Bmp.Height := GetSystemMetrics(SM_CYSCREEN);
Bmp.Canvas.Lock;
try
BitBlt(Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, DC, 0, 0, SRCCOPY);
Bmp.SaveToFile('j:/p' + IntToStr(Index) + '.bmp');
Inc(Index);
finally
Bmp.Canvas.Unlock;
ReleaseDC(0, DC);
end;
end;
constructor TCopyThread.Create;
begin
FreeOnTerminate := True;
FScrBmp := TBitmap.Create;
FScrBmp.PixelFormat := pf8bit;
FIndex := 0;
inherited Create(False);
end;
destructor TCopyThread.Destroy;
begin
FScrBmp.Free;
FScrBmp := nil;
inherited;
end;
procedure TCopyThread.Execute;
begin
while (not Terminated) do
begin
if InputDesktopSelected then CopyScreen(FScrBmp, FIndex)
else if SelectDesktop(nil) then CopyScreen(FScrBmp, FIndex);
Sleep(3000);
end;
end;
end.
http://blog.csdn.net/cdlff/article/details/3489941
因为锁定界面后Windows切换到Session0去了,而你的程序运行在当前用户Session.
WTS系API可以帮你,去Sesson0重新运行一个进程截好图后通过IPC返回当前进程就好了.
对了,Session0隔离从Windows Vista开始引入. 另外 2ccc 应该有一个 WSDT 的 单元,可惜 2ccc 不支持内容搜索
http://bbs.2ccc.com/topic.asp?topicid=506628
Delphi的TService的輸入桌面切換(服务程序)(windows登录界面如何截图)(使用了OpenDesktop和GetThreadDesktop等API)的更多相关文章
- jQuery - 中文輸入法與KeyDown/KeyPress事件
最近專案中引用了Telerik ASP.NET擴充元件AutoComplete輸入欄位,測試時發現偶爾會不聽始喚,輸入文字時無法觸發資料查詢,在Javascript Source Code裡反覆追蹤測 ...
- Ubuntu 安裝 嘸蝦米 輸入法
O S : 14.04.1-Ubuntu 加入fcitx開發團隊的repository: sudo add-apt-repository ppa:fcitx-team/nightly sudo apt ...
- JS 計算文本域還能輸入多少個字符
//輸入計數 //count:能輸入的數據總量 function Calculation(v, count) { var span = $(v).next(); va ...
- Windows 小技巧: 變更輸入法順序
Windows XP 中還是有辦法變更輸入法順序的!!只不過,要動用到 Regedit.exe 這個程式. 執行 Regedit.exe至 HKEY_CURRENT_USER\Keyboard Lay ...
- html5 表單輸入類型
輸入類型有:email,url,number,range,Date pickers(工作機制是什麼),search, 有相關類型的輸入域,會對域進行驗證. 不同的瀏覽器並不一定都支持所有的輸入類型.
- [Java] 資料輸入的差異性(System.in、BufferedReader、Scanner)
一.System.in System.in提供的read方法每次只能讀取一個字節的數據,不實用 二.BufferedReader BufferedReader類位於java.io包中,使用要加上 im ...
- 透過手機 App 在 OpenELEC(XBMC)中輸入中文
這裡介紹如何使用手機 App 在沒有中文輸入法的 OpenELEC(XBMC)中輸入中文字. OpenELEC(XBMC)雖然有內建中文語系,但是卻沒有中文的輸入法,沒辦法直接輸入中文字,這對於一般家 ...
- C# DataGridView的單元格中只能輸入數字
控件類型:DataGridView 控件名稱:dgvGift_Condition 裏面用到的:IsNumeric.NotePastText.RestoreText 等請參見 前一日志“TextBox中 ...
- IE網址欄快速輸入網址,“Ctrl+Enter”補齊“.com”
繁體中文Windows,預設 IE 在網址列輸入 abc,然後按 Ctrl+Enter ,會跳到www.abc.com.tw, 但較常用的連結是www.abc.com,如何修改这一設定呢? 可以透過修 ...
随机推荐
- shell 脚本阅读之二——ltp工具下的runltp
#!/bin/sh ################################################################################ ## ## ## ...
- Axis2(7):将Spring的装配JavaBean发布成WebService
在现今的Web应用中经常使用Spring框架来装载JavaBean.如果要想将某些在Spring中装配的JavaBean发布成WebService,使用Axis2的Spring感知功能是非常容易做到的 ...
- android的animator
3.0 以前,android支持两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画系统:property animation,这 ...
- Windows VS下搭建cocos2d-x环境搭建
VS2010以上版本(eg:VS2012/VS2013,这里本人用VS2013) 1.环境.安装包准备 2.python安装 3.cocos2d-x安装包解压安装 4.环境变量配置 5.执行setup ...
- ant_0105
在projectA中执行projectB的构件文件.projectA的构件文件内容如下 <?xml version="1.0"?> <!-- 在projectA中 ...
- Jquery学习笔记:操作form表单元素之一(文本框和下拉框)
一.概述 在web页面开发中,经常需要获取和设置表单元素的值(如文本框中的内容),特别是在ajax应用中,更是常态.本文系统的介绍下如何操作. 同操作其它html元素一样,操作的过程差不多. 第一步, ...
- matlab三维画图
matlab三维画图主要有三个命令:plot3命令.mesh命令和surf命令. plot3 plot3是三维画图的基本函数,绘制的是最为主要的3D曲线图,最主要的调用格式是: plot3(X,Y,Z ...
- paip.按键替换映射总结
paip.按键替换映射总结 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/attilax 因为 ...
- Node.js and Forever “exited with code: 0”
CentOs 6.5 using root acount, I have a working Node.js Express app: root@vps [/home/test/node]# npm ...
- 基于visual Studio2013解决C语言竞赛题之1025Bessel函数
题目 解决代码及点评 /* 功能:25. Bessel函数Jn(X)有以下的递推关系: J[n+1](x)=(2n+1)/x*J[n](x)-J[n-1](x) 并 ...