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# menuStrip控件实现鼠标滑过自动弹出功能

    让我来为你详细讲解“C# menuStrip控件实现鼠标滑过自动弹出功能”的完整攻略。 一、前置知识 在学习本攻略前,我们需要先掌握以下知识: C#语言的基础语法和控件的使用方法; menuStrip控件的基本使用方法; 鼠标事件相关的知识。 二、实现过程 首先,我们需要在窗体上添加menuStrip控件,并在其中添加菜单项。在代码中,我们可以通过以下方法来…

    C# 2023年6月3日
    00
  • C#去除DataTable重复数据的三种方法

    标题:C#去除DataTable重复数据的三种方法 方法一:使用Linq去重 步骤: 1.将DataTable转换为IEnumerable对象; 2.使用Linq的Distinct方法去重; 3.将结果转换为DataTable对象。 示例: DataTable table = new DataTable(); // 假设table中包含重复数据 IEnume…

    C# 2023年6月2日
    00
  • C#调用C++ DLL bool返回值始终为true的问题

    以下是详细的攻略: 问题描述 在使用C#调用C++编写的DLL时,可能会遇到bool类型的返回值无法正确返回的问题,始终返回true的情况。 原因分析 bool类型在C++中和C#中所代表的意义不同。在C++中,bool类型值只有0或1,而在C#中,bool类型值对应的是true或false。C#与C++之间的互操作性会导致不同的bool类型值的解释,从而出…

    C# 2023年5月15日
    00
  • 使用 C# 动态编译代码和执行的代码

    使用 C# 动态编译代码和执行的完整攻略 简单介绍 在 C# 中,我们可以使用 CodeDomProvider 来动态编译代码并执行。CodeDomProvider 是一个可以根据指定文件扩展名和编译器参数来编译程序集的编译器。 示例1:动态编译代码并执行 以下是一个简单的示例,演示了如何使用 CodeDomProvider 对 C# 代码进行动态编译和执行…

    C# 2023年6月7日
    00
  • vs 中C#项目读取JSON配置文件的方法

    下面我来详细讲解在 VS 中 C# 项目读取 JSON 配置文件的方法。 一、准备工作 在讲解具体方法前,我们需要先进行准备工作: 首先需要确保你的项目中已经包含了 Newtonsoft.Json 的 NuGet 包,否则,请右键项目选择“管理 NuGet 包”来安装该包。 其次需要准备一个 JSON 配置文件作为示例,这里以以下内容为例: { "…

    C# 2023年5月31日
    00
  • c#实现一元二次方程求解器示例分享

    标题:C#实现一元二次方程求解器示例分享 简介:本文将介绍如何用C#编写一元二次方程求解器,并提供两个示例来说明如何使用该程序。 代码部分: using System; namespace QuadraticEquationSolver { class Program { static void Main(string[] args) { Console.W…

    C# 2023年6月7日
    00
  • C#实现排序的代码详解

    首先,我们需要了解排序算法的基本概念和分类。排序是将一组混乱的元素按照某种规则进行排列的过程,常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、归并排序等。其中,冒泡排序和插入排序适用于小规模的数据排序,而快速排序、归并排序则适用于大规模的数据排序。 接下来,我们以C#语言为例,讲解几种排序算法的实现步骤。 冒泡排序 冒泡排序是一种简单的排序算法,它的…

    C# 2023年5月31日
    00
  • Unity3D获取当前键盘按键及Unity3D鼠标、键盘的基本操作

    Unity3D获取当前键盘按键: Unity3D中获取当前键盘按键可以通过Input.GetKey(),Input.GetKeyDown(),Input.GetKeyUp()三个函数来实现。 其中,Input.GetKeyDown()用于检测用户是否按下某个键,如果是则返回true,否则返回false。而Input.GetKeyUp()用于检测用户是否松开某…

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