直接上代码,比较简单,容易看懂。
需要注意的是:启动的监控程序默认桌面是WinLogon,如果登陆成功后,被启动的程序,需要设置活动桌面。(通过OpenInputDesktop和GetUserObjectInformation当前的活动桌面,然后通过SetThreadDesktop设置线程桌面)
// RemoteControlService.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "RemoteControlService.h"
#include <Winsvc.h>
#include "CommonClas.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
TCHAR szServiceName[] = _T("Win8 Server");
DWORD dwThreadID;
HANDLE hEvent = INVALID_HANDLE_VALUE;
SERVICE_STATUS status;
SERVICE_STATUS_HANDLE hServiceStatus;
void Init();
BOOL IsServiceInstalled();
BOOL InstallService();
BOOL UninstallService();
BOOL ServiceCtrlStart();
BOOL ServiceCtrlStop();
void WINAPI ServiceMain();
void WINAPI ServiceStrl(DWORD dwOpcode);
BOOL RunRemoteControl();
// The one and only application object
CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: MFC initialization failed\n"));
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
}
Init();
dwThreadID = ::GetCurrentThreadId();
SERVICE_TABLE_ENTRY st[] =
{
{ szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
{ NULL, NULL }
};
TCHAR *lpCmdLine = argv[1];
if ( argc == 2 )
{
BOOL bRet;
if (wcsicmp(lpCmdLine, L"/install") == 0)
{
bRet = InstallService();
if ( bRet == TRUE )
{
printf( "Install service %s success", szServiceName );
}
else
{
printf( "Install service %s failed", szServiceName );
}
}
else if (wcsicmp(lpCmdLine, L"/uninstall") == 0)
{
bRet = UninstallService();
if ( bRet == TRUE )
{
printf( "Uninstall service %s success", szServiceName );
}
else