Windows服务编写(Windows Service,system权限)程序显示界面与用户交互(xp,win7通用)

Windows服务编写(WindowsService,system权限)程序显示界面与用户交互(xp,win7通用)

在Windows中编写服务程序,本质上是开发一个后台运行的应用程序。因此,Windows服务程序在运行时是无法显示界面,并且默认使用SYSTEM权限运行。如果需要显示界面并与用户进行交互,需要使用一些技巧来实现。

基本思路

首先,需要使用Win32 API中的Windows Station和Desktop相关函数来创建一个专门用于交互的Desktop。然后,在安装服务时,使用Interact With Desktop选项参数,指定使用刚创建的Desktop来运行服务程序。通过这样的方式,服务程序就可以在创建的Desktop上显示界面,并与用户进行交互。

以下是Windows Station和Desktop相关函数的一些示例代码:

//create a new Window Station
HANDLE hWinStation = CreateWindowStation(
    "MYWINSTA",
    0,
    WINSTA_ALL_ACCESS,
    NULL
);

//create a new desktop in the Window Station
HANDLE hDesktop = CreateDesktop(
    "MYDESK",
    NULL,
    NULL,
    0,
    DESKTOP_ALL_ACCESS,
    NULL
);

//set the desktop for the current process
SetThreadDesktop(hDesktop);

服务程序中显示界面

在服务程序中显示界面,需要创建一个窗口并显示出来。但是,由于服务程序默认运行在SYSTEM用户权限下,而用户权限下的桌面窗口是无法被SYSTEM用户访问的,所以需要先使用上面提到的方法创建专门用于交互的Desktop。

示例代码:

HWND hwnd;
HINSTANCE hinstance;

BOOL CALLBACK MyDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_INITDIALOG:
            return TRUE;

        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
            {
                //close the dialog
                EndDialog(hwndDlg, LOWORD(wParam));
                return TRUE;
            }
            break;
    }

    return FALSE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    hinstance = hInstance;

    //create the dialog window
    hwnd = CreateDialog(
        hInstance,
        MAKEINTRESOURCE(IDD_DIALOG1),
        NULL,
        MyDialogProc
    );

    //show the dialog window
    ShowWindow(hwnd, SW_SHOW);

    //run the message loop
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    //destroy the dialog window
    DestroyWindow(hwnd);

    return 0;
}

使用上述代码可以创建一个带有OK和Cancel按钮的窗口,并显示在创建的Desktop上。

安装服务时使用Interact With Desktop选项

使用sc命令安装服务时,使用type参数指定服务类型为自己编写的服务程序,使用binPath参数指定服务程序的路径,使用interact参数指定使用交互式桌面。

示例命令:

sc create MyService type= own start= demand binPath= "C:\Path\To\MyService.exe" displayName= "My Service" depend= ServiceDependOn1/ServiceDependOn2 interact= yes

在上述示例命令中,type参数指定了服务类型为自己编写的服务程序(own),binPath参数指定了服务程序的路径,interact参数指定使用交互式桌面。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Windows服务编写(Windows Service,system权限)程序显示界面与用户交互(xp,win7通用) - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • C#创建控制Windows服务

    创建 Windows 服务可以让我们的程序在后台运行,从而实现一些后台任务,例如数据同步、邮件服务等。C#作为一门强大的编程语言,可以很方便地创建Windows服务。本文将提供C#创建控制Windows服务的完整攻略,内容包括创建 Windows 服务、安装和卸载服务、启动和停止服务,以及包含两个示例说明。 创建 Windows 服务 创建 Windows …

    C# 2023年6月3日
    00
  • C#基础:基于const与readonly的深入研究

    C#基础:基于const与readonly的深入研究 介绍 在C#中,常量是指在编译时就已经确定并且不可更改的值,常量有两种:const和readonly。两者看起来很相似,但是它们在实现上有一些区别。在本文中,我们将深入探讨const和readonly的异同点,并且提供一些使用示例帮助您更好地理解这两种常量。 readonly 定义 readonly关键字…

    C# 2023年6月1日
    00
  • c# 实现RSA非对称加密算法

    C# 实现RSA非对称加密算法攻略 RSA加密算法简介 RSA加密算法是一种非对称加密算法,常用于网络通信中的数据加密。 该算法利用了两个相对来说很大的质数来生成公钥与私钥。公钥可自由分发,用于数据的加密;而私钥则由加密方自己保存,用于解密已被加密的数据。因为公钥可以公开,所以RSA加密算法是非对称加密;而且基于数论,经过加解密后,保证了数据的完整性、保密性…

    C# 2023年6月6日
    00
  • C#实现如何使用短信平台自动通知用户实例

    C#实现使用短信平台自动通知用户 简介 短信通知是现在很多网站或应用程序都采用的一种通知方式,以及提供给客户服务的一种方式。本文将讲解如何使用C#实现自动向用户发送短信通知。 步骤 选择短信平台 首先需要选择一家短信平台进行合作,目前市面上主流的短信平台有阿里云短信、腾讯云短信、云之讯等,选择平台需考虑到短信发送成功率、价格等相关因素。 注册并获取短信API…

    C# 2023年6月6日
    00
  • WinForm调用百度地图接口用法示例

    下面是关于“WinForm调用百度地图接口用法示例”的完整攻略。 什么是百度地图接口? 百度地图接口是百度提供的用于开发者在自己的应用中集成百度地图功能的一组API,通过它可以满足不同应用场景的地图需求,包括地图显示、POI搜索、路径规划、定位等功能。 WinForm调用百度地图接口用法示例 步骤1:申请百度地图开发者账号 在开始使用百度地图接口之前,需要先…

    C# 2023年6月6日
    00
  • c#创建Graphics对象的三种方法

    让我们来详细讲解一下c#创建Graphics对象的三种方法。 前言 在C#中,我们可以使用Graphics对象来进行图形绘制操作,比如绘制直线、矩形、椭圆、多边形等。Graphics对象通常与平面控件(如PictureBox和Panel)配合使用,通过将图像绘制到控件上来实现绘制功能。那么在C#中,有哪些方法可以创建Graphics对象呢? 创建Graphi…

    C# 2023年6月1日
    00
  • C# Websocket连接实现wss协议

    C# Websocket连接实现wss协议攻略 前言 WebSocket 协议是一种基于 TCP 传输的全双工通信协议。它的目标是在 Web 浏览器和服务器之间建立实时通讯。wss 协议是一种加密协议,可以保证通讯过程中的数据安全性。本文将分享如何使用 C# 实现 wss 协议的 Websocket 通讯。 准备工作 在开始前,我们需要准备以下内容: 最新版…

    C# 2023年6月6日
    00
  • unity 如何获取button文本的内容

    获取Unity中Button组件上的文本内容可以使用以下代码: string buttonText = button.GetComponentInChildren<Text>().text; 其中,button是你所要获取文本的Button组件对象。此部分代码可以获取Button组件子对象上的文本,其前提是需要确保Button组件的Text组件在…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部