如何实现服务器控制客户端的开关机操作/?

解决方案 »

  1.   

    不需要和硬件打交道那么复杂,
    window NT以上系统启动都是由winlogo调用msgina.dll进行工作的。建议你学习一下Gina相关知识,可以做到。(可以参看MSDN中GINA [Winlogon/GINA])简单来说,
    windows的启动,注销,锁定,关机,重启分别都对应一个sas消息,
    分别是WLX_SAS_ACTION_LOGOFF,WLX_SAS_ACTION_SHUTDOWN,WLX_SAS_ACTION_SHUTDOWN_REBOOT,WLX_SAS_ACTION_SHUTDOWN_POWER_OFF等等,winlogo收到这小sas消息后,会调用gina里面的对应函数,比如WlxLoggedOnSAS,WlxLogoutSAS,WlxDisplayLockedNotice等等。
    你需要做的就是用自己写的gina替换msgina.dll,在里面做你想做的事情就可以了,呵呵
      

  2.   

    在客户端,具体的关机代码如下:VOID WINAPI ExitWin()
    {
        DWORD dwVer;
        HANDLE hProcess, hToken;
        TOKEN_PRIVILEGES NewState;
        DWORD ProcessId, ReturnLength = 0;
        LUID luidPrivilegeLUID;    dwVer=GetOS();
        if(dwVer==VER_PLATFORM_WIN32_WINDOWS)
            ExitWindowsEx(1,0);    else if(dwVer==VER_PLATFORM_WIN32_NT)
        {
            ProcessId = GetCurrentProcessId();
            hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);
            OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES, &hToken);
            LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &luidPrivilegeLUID);        NewState.PrivilegeCount = 1;
            NewState.Privileges[0].Luid = luidPrivilegeLUID;
            NewState.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;        if(AdjustTokenPrivileges(hToken, FALSE, &NewState, NULL, NULL, NULL))
                ExitWindowsEx(EWX_FORCE|EWX_POWEROFF,0);
        }
    }//判断系统类型  DWORD WINAPI GetOS()
    {
        OSVERSIONINFO os;
        TCHAR sVersion[MAX_PATH];    os.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
        GetVersionEx(&os);
        switch(os.dwPlatformId)
        {
        case VER_PLATFORM_WIN32_WINDOWS:
            return VER_PLATFORM_WIN32_WINDOWS;    case VER_PLATFORM_WIN32_NT:
            return VER_PLATFORM_WIN32_NT;
        }
    }
      

  3.   

    实在对不起大家,只要关机和得启就行了!谁有源代码给我发一份!
    [email protected]
      

  4.   

    ...
           hoho...搞根电线,把客户端的开关用电线连到电路版上,然后串口..yes!!!