一個實現windows下注銷、關機、重啓的程序

想一想來開源社區也有一段時間了,什麼也沒留下,今天這算是第一篇博文吧,哈哈...編程

近來在學習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,這才讓對話框顯示在屏幕中央...ui

求教高手,代碼如何實現這一功能?先謝過!spa

相關文章
相關標籤/搜索