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技术站