自动关机需要版本信息,NT和98关机方式不一样,怎么获得版本信息呢?还有,我的机子是2k的,调用ExitWindowsEx后,机子是关后显示“你现在可以安全的关机了”,怎么关电源?用Windows的关机是不会出现这种情况的。知道的朋友告诉我一下。多攒人品多积分:)

解决方案 »

  1.   

    GetVersionEx获得版本信息
    显示“你现在可以安全的关机了”是和你的主板有关,你的班子太老了。
      

  2.   

    ExitWindowsEx的参数用EWX_POWEROFF看看?
      

  3.   

    可是Windows系统下点击关机是可以全关掉的
      

  4.   

    GetVersionEx()  具体要看MSDN 和那个数进行&
      

  5.   

    //关机函数,可以关闭电源,对应“关机关电源”按钮
    //此函数使用的方法是:通过模拟键盘事件,
    //达到实现“开始-关机-选择关机命令-确定(即回车按键)”的方式进行关机
    //具体处理是在OnTimer函数中,通过定时器依次实现每个键盘事件
    void CShutDownComputerDlg::OnButton2() 
    {
    keybd_event( VK_NUMLOCK,0x45,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0); SetTimer(1,2000,NULL);
    }void CShutDownComputerDlg::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    switch(nIDEvent)
    {
    case 1://if (nIDEvent == 1)在OnButton2函数中的设定,
    {
    KillTimer(nIDEvent);
    SetTimer(2, 2000, NULL);
    keybd_event(VK_LWIN,0,0,0);
    keybd_event(VK_LWIN,0,KEYEVENTF_KEYUP,0);//模拟键盘上的windows键
    }
    break;
    case 2://else if (nIDEvent == 2)
    {
    KillTimer(nIDEvent);
    SetTimer(3, 2000, NULL);
    keybd_event('U',0,0,0);
    keybd_event('U',0,0,0);//模拟键盘上的U键,即选择“关机”
    }
    break;
    case 3://else if (nIDEvent == 3)
    {
    static int i = 0;
    KillTimer(nIDEvent);
    if (i < 4) //循环4次,是为了是选择命令到最上边
    {
    SetTimer(3, 2000, NULL);
    keybd_event(VK_UP,0,0,0);
    keybd_event(VK_UP,0,KEYEVENTF_KEYUP,0);//模拟键盘上的方向键的“上”键
    i++;
    }
    else
    {
    SetTimer(4, 2000, NULL);
    }
    }
    break;
    case 4://else if (nIDEvent == 4)
    {
    KillTimer(nIDEvent);
    SetTimer(5, 2000, NULL);
    keybd_event(VK_DOWN,0,0,0);
    keybd_event(VK_DOWN,0,KEYEVENTF_KEYUP,0);//模拟键盘上的下命令,因为“关机”在第二个
    }
    break;
    case 5://else if (nIDEvent == 5)
    {
    KillTimer(nIDEvent);
    keybd_event(VK_RETURN,0,0,0);
    keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);//模拟"回车"命令
    } }//end switch CDialog::OnTimer(nIDEvent);
    }
      

  6.   

    #include <windows.h>
    #include <stdio.h>BOOL DisplaySystemVersion()
    {
       OSVERSIONINFOEX osvi;
       BOOL bOsVersionInfoEx;   // Try calling GetVersionEx using the OSVERSIONINFOEX structure,
       // which is supported on Windows 2000.
       //
       // If that fails, try using the OSVERSIONINFO structure.   ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
       osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);   if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
       {
          // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.      osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
          if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) 
             return FALSE;
       }   switch (osvi.dwPlatformId)
       {
          case VER_PLATFORM_WIN32_NT:      // Test for the product.         if ( osvi.dwMajorVersion <= 4 )
                printf( "Microsoft Windows NT ");         if ( osvi.dwMajorVersion == 5 )
                printf ("Microsoft Windows 2000 ");      // Test for workstation versus server.         if( bOsVersionInfoEx )
             {
                if ( osvi.wProductType == VER_NT_WORKSTATION )
                   printf ( "Professional " );            if ( osvi.wProductType == VER_NT_SERVER )
                   printf ( "Server " );
             }
             else
             {
                HKEY hKey;
                char szProductType[80];
                DWORD dwBufLen;            RegOpenKeyEx( HKEY_LOCAL_MACHINE,
                   "SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
                   0, KEY_QUERY_VALUE, &hKey );
                RegQueryValueEx( hKey, "ProductType", NULL, NULL,
                   (LPBYTE) szProductType, &dwBufLen);
                RegCloseKey( hKey );
                if ( lstrcmpi( "WINNT", szProductType) == 0 )
                   printf( "Workstation " );
                if ( lstrcmpi( "SERVERNT", szProductType) == 0 )
                   printf( "Server " );
             }      // Display version, service pack (if any), and build number.         printf ("version %d.%d %s (Build %d)\n",
                osvi.dwMajorVersion,
                osvi.dwMinorVersion,
                osvi.szCSDVersion,
                osvi.dwBuildNumber & 0xFFFF);         break;      case VER_PLATFORM_WIN32_WINDOWS:         if ((osvi.dwMajorVersion > 4) || 
                ((osvi.dwMajorVersion == 4) && (osvi.dwMinorVersion > 0)))
             {
                 printf ("Microsoft Windows 98 ");
             } 
             else printf ("Microsoft Windows 95 ");         break;      case VER_PLATFORM_WIN32s:         printf ("Microsoft Win32s ");
             break;
       }
       return TRUE; 
    }
      

  7.   


    //我也找了一个,试用成功
    #include <stdio.h>
    #include <windows.h> 
    int main() 

         //定义重起的时候发送给所有用户的消息
         LPSTR msg="Reboot ";
         //尝试用最简单的API函数重起 
         if(ExitWindowsEx(EWX_POWEROFF, 0))return TRUE;
         if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))return TRUE;
         //因为上面的重起不成功,所以需要调整本进程的特权
         HANDLE hToken;
         TOKEN_PRIVILEGES tkp;
         if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return FALSE;
         //获取重起的特权SE_SHUTDOWN_NAME
         LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
         tkp.PrivilegeCount = 1;
         tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
         AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
         //判断是NT内核还是9x内核,选择用不同的方式
         if(!(GetVersion() & 0x80000000))
           InitiateSystemShutdown(NULL, msg, 20, TRUE, TRUE);
         else if (!ExitWindowsEx(EWX_POWEROFF, 0))
             if(!ExitWindowsEx(EWX_POWEROFF|EWX_FORCE, 0))
                return FALSE; 
         return TRUE;