`
hulunberbus
  • 浏览: 859521 次
文章分类
社区版块
存档分类
最新评论

从windows服务中打开窗口进程(转)

 
阅读更多

http://dev.csdn.net/author/axman/420f84d550804bfbaf534819c757a2b9.html

AVR地方业务中有一个DBA_BJLDNW工具要在服务器上运行着.一旦断开业务即中止.需要写一个守护程序监视它,

一旦发现关闭了即重新启动.

为了防止守护程序本身被用户关闭,所以我打算做一个windows服务在后台运行.每5分钟列举一个当前系统进程,如果

没有发现DBA_BJLDNW.exe则重新启动.

问题是windows服务不是窗口进程,在这个进程中调用ShellExecute打开的应用程序也是在后台运行,不能显示在当前窗口中.

后来搜索到可以在Windows服务中打开窗口程序的方法.就是打开用户WinSta0和desktop,取得和用户交互的权限后再打开窗口进程,果然可以在windows服务中打开窗口进程了:

HINSTANCE hProcessSnap = NULL;
PROCESSENTRY32 pe32 = {0};

//获取进程的内存镜照
hProcessSnap = (HINSTANCE) ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap == (HANDLE) -1) return ;
pe32.dwSize = sizeof(PROCESSENTRY32);

DWORD flag = 0;
CString theProcssName = "DBA_BJLDNW.exe";

//列举进程

if(::Process32First(hProcessSnap,&pe32)){
do{
if(!theProcssName.CompareNoCase(pe32.szExeFile)){
flag = 1;
break;
}
}
while(Process32Next(hProcessSnap,&pe32));
}
::CloseHandle(hProcessSnap);

if(!flag){ //如果没有找到

HDESK hdeskCurrent;
HDESK hdesk;
HWINSTA hwinstaCurrent;
HWINSTA hwinsta;

hwinstaCurrent = GetProcessWindowStation();

if (hwinstaCurrent == NULL){
LogEvent(_T("get window station err"));
return ;
}

hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
if (hdeskCurrent == NULL){
LogEvent(_T("get window desktop err"));
return ;
}

//打开用户的winsta0
hwinsta = OpenWindowStation("winsta0", FALSE,
WINSTA_ACCESSCLIPBOARD |
WINSTA_ACCESSGLOBALATOMS |
WINSTA_CREATEDESKTOP |
WINSTA_ENUMDESKTOPS |
WINSTA_ENUMERATE |
WINSTA_EXITWINDOWS |
WINSTA_READATTRIBUTES |
WINSTA_READSCREEN |
WINSTA_WRITEATTRIBUTES);
if (hwinsta == NULL){
LogEvent(_T("open window station err"));
return ;
}

if (!SetProcessWindowStation(hwinsta)){
LogEvent(_T("Set window station err"));
return ;
}

//打开desktop
hdesk = OpenDesktop("default", 0, FALSE,
DESKTOP_CREATEMENU |
DESKTOP_CREATEWINDOW |
DESKTOP_ENUMERATE |
DESKTOP_HOOKCONTROL |
DESKTOP_JOURNALPLAYBACK |
DESKTOP_JOURNALRECORD |
DESKTOP_READOBJECTS |
DESKTOP_SWITCHDESKTOP |
DESKTOP_WRITEOBJECTS);
if (hdesk == NULL){
LogEvent(_T("Open desktop err"));
return;
}

SetThreadDesktop(hdesk);

::ShellExecute(0,NULL,"f://ivrtj//DBA//DBA_BJLDNW.exe",NULL,NULL,SW_MAXIMIZE);
CString msg = "DBA_BJLDNW.exe 被重启动";
LogEvent(msg);

SetProcessWindowStation(hwinstaCurrent);
SetThreadDesktop(hdeskCurrent);
CloseWindowStation(hwinsta);
CloseDesktop(hdesk);
}

分享到:
评论

相关推荐

    监视启动窗口进程

    使用钩技术来WINDOWS系统打开的窗口名称。 监视启动窗口进程

    Windows 进程管理器

    顶部窗口总是显示当前活动进程的列表(包括拥有它们的帐户的名称),而底部窗口中显示的信息取决于 Process Explorer 所处的模式:如果它处于句柄模式下,则可以看到顶部窗口中的所选进程打开的句柄;如果 Process ...

    windows下qt获取所有桌面窗口句柄、类名和标题

    windows下qt获取所有桌面窗口、类名和标题,辅助开发的小工具 qDebug()窗口句柄:"窗口类名:"窗口标题:";

    c# windows服务 启动外部程序,程序已开启,但看不到界面

    c# windows服务 启动外部程序,程序已开启,但看不到界面

    VC实现A进程窗口嵌入到B进程窗口中显示的方法

    主要介绍了VC实现A进程窗口嵌入到B进程窗口中显示的方法,对于理解windows程序运行原理的进程问题有一定的帮助,需要的朋友可以参考下

    Windows系统下程序窗口置顶显示工具

    支持Win10系统的程序窗口菜单增强工具,可以让窗口置顶,设置程序窗口的透明度,设置进程优先级,截图窗口界面,查看程序详细信息等。 窗口置顶设置和取消快捷键: 1. 打开当前程序窗口,按键盘【Pause】键,再按一...

    使用HOOK拦截任务管理器中直接杀进程的消息

    大家都知道,在任务管理器进程标签中直接杀进程,是直接杀,不交给用户处理.很多人都在为了防止自己的进程被误杀而苦苦思索,但是一般的拦截消息的方法又几乎都不管用. 在这里,给大家一个Delphi的源码,使用HOOK进行拦截...

    Windows 窗口选项卡增强工具 Stardock Groupy 1.43 x64 中文多语免费版.rar

    在一个窗口中将多个打开的应用程序或文档分组在一起,将它们显示在单独的选项卡中,以便更轻松,更快速地访问。本站发布的也有类似的工具,例如,WindowTabs 2018 中文版、Clover 中文版等等,它们都是 Windows 选项...

    Windows 窗口选项卡增强工具 Stardock Groupy 1.43 x64 中文多语免费版.zip

    在一个窗口中将多个打开的应用程序或文档分组在一起,将它们显示在单独的选项卡中,以便更轻松,更快速地访问。本站发布的也有类似的工具,例如,WindowTabs 2018 中文版、Clover 中文版等等,它们都是 Windows 选项...

    windowsnt 技术内幕

    Windows NT中的审核(Audit)事件简介 规划并实现审核策略 打开文件、文件夹及打印机的审核功能 使用事件查看器检查审核事件 安全性日志(Securty Log)的归档 使用服务器管理器查看正在使用的资源 断开用户与服务器的...

    Windows窗口自动化操作类forVB6_V2.0 clsWindow源码

    目前该类封装了绝大部分对windows窗口的常用操作,例如:获取窗口句柄,设置窗口为活动窗口,设置窗口内文本框内容,点击窗口内的某些按钮等。 这个类现在还在一直不断地扩充,功能已经很强大很广泛,使用它可以...

    天使进程管理器 v3.3

    “天使进程管理器”是一款简洁易用、功能众多的WINDOWS进程管理软件,拥有WINDOWS任务管理器中的所有常用进程管理功能,并根据实际应用需要,增加了进程快照保存、精简进程、进程文件属性查看、快速进入进程所在文件...

    查看windows端口占用情况以及终止某个进程.exe

    传统的查看端口占用方式为:打开命令窗口 (以管理员身份运行) 开始—->运行—->cmd ,或者是 window+R 组合键,调出命令窗口。查找所有运行的端口输入命令。然后找到相应端口,找到对应的进程,杀死对应进程,这种...

    VB枚举窗口和进程信息-源码.rar

    VB枚举窗口和进程信息-源码,获取当前打开的所有窗口的标题和进程ID信息,类似Windows中的任务管理器的功能,根据窗体的类名或者标题名,调用FindWindow函数来取得相应的窗体,调用BringWindowToTop函数,将窗体激活...

    无忧隐藏一款专业的窗口、进程、文件(夹)隐藏软件

    【产品概述】 无忧隐藏是一款专业的窗口、进程、文件(夹)隐藏软件,并提供了...对于在工作中需要频繁切换窗口的用户,例如需要频繁的从一个窗口复制文字到另一个窗口,也可以利用快速隐藏功能来实现窗口快速切换。

    QT 监测其他进程运行状态,包括运行还是未启动;监测对象(这个进程)是有界面的,可以判断此界面是否为当前用户正在使用的界面

    QT 监测其他进程运行状态,包括运行还是未启动,或者是否置顶状态;监测对象(这个进程)是有界面的,可以判断此界面是否为当前用户正在使用的界面。用到CreateToolhelp32Snapshot;GetWindow;...

    强力进程管理工具

    简介:FxProcessTool是一个强大的Windows进程查看管理工具,可查看、控制和结束所有进程。程序可以列举出进程的各项详细信息,可以检测是否存在隐藏进程或伪装程序,是目前较为完备的进程和任务管理工具之一。 具体...

    Python实现遍历windows所有窗口并输出窗口标题的方法

    主要介绍了Python实现遍历windows所有窗口并输出窗口标题的方法,涉及Python调用及遍历windows窗口句柄的技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    程序置顶,让你的窗口一直在最前面

    绿色小软件,聊天,看电影,传照片,发微薄,同时进行。用得着的朋友很实用的哦

    Windows下增强版任务管理器

    顶部窗口始终显示当前活动进程的列表,包括其所属帐户的名称,而底部窗口中显示的信息取决于 进程资源管理器 所处模式:如果它处于句柄模式,你将看到顶部窗口中选择的进程已打开的句柄;如果 进程资源管理器 处于 ...

Global site tag (gtag.js) - Google Analytics