一个实现windows下注销、关机、重启的程序

想想来开源社区也有一段时间了,什么也没留下,今天这算是第一篇博文吧,哈哈...

近来在学习windows编程,说起编程,惭愧啊,接触有两年多了,但一直没啥进展,几乎没写过什么代码...下面的代码并非原创,是在原创的基础上修改了对话框资源与一点消息执行方式...

主对话框        提示框

#include <tchar.h>
#include <Windows.h>
#include "resource.h"
#include <atltypes.h>

BOOL EnableShutDownPriv()
{
	//Get Privilege
	HANDLE hToken = NULL;
	TOKEN_PRIVILEGES tkp = {0};
	if ( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ) {
		return FALSE;
	}
	if ( !LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid ) ) {
		CloseHandle( hToken );
		return FALSE;
	}
	tkp.PrivilegeCount = 1;
	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

	if ( !AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES), NULL, NULL ) ) {
		CloseHandle( hToken );
		return FALSE;
	}
	return TRUE;
}

BOOL ReSetWindows(DWORD dwFlags, BOOL bForce)
{
	//Check the param;
	if ( dwFlags != EWX_LOGOFF && dwFlags != EWX_REBOOT && dwFlags != EWX_SHUTDOWN ) {
		return FALSE;
	}

	//Get the os version;
	OSVERSIONINFO osvi = {0};
	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
	if ( !GetVersionEx(&osvi) ) {
		return FALSE;
	}
	if ( osvi.dwPlatformId == VER_PLATFORM_WIN32_NT ) {
		EnableShutDownPriv();
	}
	dwFlags |= (bForce != FALSE) ? EWX_FORCE : EWX_FORCEIFHUNG;
	return ExitWindowsEx(dwFlags, 0);
}

INT_PTR CALLBACK DialogProc( HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	switch(uMsg)
	{
	case WM_COMMAND:
		{
			switch(wParam)
			{
			case IDC_LOGOFF_BUTTON:
				{
					ReSetWindows(EWX_LOGOFF, FALSE);
				}
				break;
			case IDC_SHUTDOWN_BUTTON:
				{
					ReSetWindows(EWX_SHUTDOWN, FALSE);
				}
				break;
			case IDC_REBOOT_BUTTON:
				{
					ReSetWindows(EWX_REBOOT, FALSE);
				}
				break;
			case IDCANCEL:
				{
					int iRet = MessageBox(hwndDlg, _T("您选择了关闭窗口!"), _T("提示"), MB_OKCANCEL);
					if ( iRet == IDOK ) {
						EndDialog(hwndDlg, IDCANCEL);
					}
				}
				break;
			default:break;
			}
		}
		break;
	default:break;
	}
	return 0;
}

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
	DialogBox( hInstance,MAKEINTRESOURCE(IDD_MAIN_DIALOG),NULL,DialogProc);

	return 0;
}

遇到的问题:

这样创建的对话框窗口默认是出现在屏幕的左上角,为了让它出现在屏幕中央,先是想过在对话框初始化时调用SetWindowPos函数进行位置的设置,但没找到获取对话框资源尺寸的API ;也想过用MoveWindow,也是同样的问题...

//在DialogProc函数中switch(uMsg)添加一个case分支:
case WM_INITDIALOG:
{
    //add code here
}
break;

后还是在对话框资源的属性里把center置为TRUE,这才让对话框显示在屏幕中央...

求教高手,代码如何实现这一功能?先谢过!

你可能感兴趣的:(一个实现windows下注销、关机、重启的程序)