想想来开源社区也有一段时间了,什么也没留下,今天这算是第一篇博文吧,哈哈...
近来在学习windows编程,说起编程,惭愧啊,接触有两年多了,但一直没啥进展,几乎没写过什么代码...下面的代码并非原创,是在原创的基础上修改了对话框资源与一点消息执行方式...
#include#include #include "resource.h"#include 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,这才让对话框显示在屏幕中央...
求教高手,代码如何实现这一功能?先谢过!