需要自动关机,vc下怎么获得不同Windows的版本信息? 自动关机需要版本信息,NT和98关机方式不一样,怎么获得版本信息呢?还有,我的机子是2k的,调用ExitWindowsEx后,机子是关后显示“你现在可以安全的关机了”,怎么关电源?用Windows的关机是不会出现这种情况的。知道的朋友告诉我一下。多攒人品多积分:) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 GetVersionEx获得版本信息显示“你现在可以安全的关机了”是和你的主板有关,你的班子太老了。 ExitWindowsEx的参数用EWX_POWEROFF看看? 可是Windows系统下点击关机是可以全关掉的 GetVersionEx() 具体要看MSDN 和那个数进行& //关机函数,可以关闭电源,对应“关机关电源”按钮//此函数使用的方法是:通过模拟键盘事件,//达到实现“开始-关机-选择关机命令-确定(即回车按键)”的方式进行关机//具体处理是在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);} #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; } //我也找了一个,试用成功#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; } CBCGPGridItem怎么向外通知自己内容改变? VC版块只有四个小版主合格!!! listctrl copy的问题? 下面几个警告该如何消除? 800分求解——续三,散分了! 用 WSAAsyncSelect怎么作多个客户端的连接!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 想在厦门工作的人进 odbc数据库编程 本地共享多媒体后,远端只有视频,没有声音 北京 '拽哥、拽妹' 聚会! 系统在休眠状态下启动系统后,如何屏蔽掉那个密码提示对话框,实现直接登陆 我想做个程序能自动分析TCP头,如果有含有torrent文件类型的字符,就断了这个连接
显示“你现在可以安全的关机了”是和你的主板有关,你的班子太老了。
//此函数使用的方法是:通过模拟键盘事件,
//达到实现“开始-关机-选择关机命令-确定(即回车按键)”的方式进行关机
//具体处理是在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);
}
#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;
}
//我也找了一个,试用成功
#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;
}