스크린 샷
글 수 7,279
제목 : 무*님 HotKey용 64비트 종료창
네트워크빌런
무*님이 올려주신 HotKey 자료에 셧다운 버튼 누르면 확인 창이 떴으면 좋겠다는 한 회원분의 댓글에 위 스샷과 같은 종료 창 프로그램을 64비트용으로 구해다가 주시면 반영하겠다는 댓글이 생각나서 C언어로 급조해서 올립니다. 하는 일은 99% 똑같습니다 ^^ shutdown.exe
요 밑에서부터는 궁금하신 분들만 =======
우선 소스 코드는 아래와 같습니다.
#include <windows.h>
const char* _ = "Rewritten by Network Villain, windowsforum.kr";
// Declare global variables for the window and buttons
HWND hWnd, hButton1, hButton2;
// Declare handler for the window
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_COMMAND:
// Handle button click events
if (LOWORD(wParam) == BN_CLICKED && (HWND)lParam == hButton1)
InitiateSystemShutdownExW(NULL, NULL, 0, true, false, 0);
else if (LOWORD(wParam) == BN_CLICKED && (HWND)lParam == hButton2)
InitiateSystemShutdownExW(NULL, NULL, 0, true, true, 0);
break;
case WM_DESTROY:
// Handle window close event
PostQuitMessage(0);
break;
case WM_KEYDOWN:
// Handle key down events
if (wParam == VK_ESCAPE)
SendMessage(hwnd, WM_CLOSE, 0, 0);
break;
default:
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// Get a token for this process.
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return( FALSE );
// Get the LUID for the shutdown privilege.
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);
if (GetLastError() != ERROR_SUCCESS)
return FALSE;
// Register the window class
WNDCLASSW wc = {0};
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.hbrBackground = GetSysColorBrush(COLOR_BTNFACE); // Set background color to dialog color
wc.lpszClassName = L"ShutdownWindow";
wc.hIcon = LoadIconW(hInstance, MAKEINTRESOURCEW(99)); // Set window icon as the exe's icon
RegisterClassW(&wc);
// Create the window
hWnd = CreateWindowW(L"ShutdownWindow", L"종료 옵션", WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, 205, 90, NULL, NULL, hInstance, NULL);
// Center the window on the screen
RECT rect;
GetWindowRect(hWnd, &rect);
int xPos = (GetSystemMetrics(SM_CXSCREEN) - rect.right + rect.left) / 2;
int yPos = (GetSystemMetrics(SM_CYSCREEN) - rect.bottom + rect.top) / 2;
SetWindowPos(hWnd, NULL, xPos, yPos, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
// Create the buttons
hButton1 = CreateWindowW(L"BUTTON", L"종료", WS_CHILD | WS_VISIBLE, 15, 15, 75, 35, hWnd, NULL, hInstance, NULL);
hButton2 = CreateWindowW(L"BUTTON", L"재시작", WS_CHILD | WS_VISIBLE, 105, 15, 75, 35, hWnd, NULL, hInstance, NULL);
// Set the system font for the buttons
HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
SendMessage(hButton1, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0));
SendMessage(hButton2, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0));
// Show the window
ShowWindow(hWnd, nCmdShow);
// Enter the message loop
MSG msg = {0};
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
shutdown.c 파일로도 첨부해뒀습니다. 그런데 이거 그냥 컴파일해서 사용하면 안이쁘게 나옵니다.
Resource Hacker를 이용해서 리소스(shutdown.res)를 먹여줘야 하는데 이것도 궁금하신 분들만 ^^
감사합니다 ^^
댓글 [4]
무월
- 2023.05.12
- 05:06:53
자유게시판에 뼈대 ISO 잠시 나눔하면서 올렸다가 게시글을 지웠는데 기억하시고 남겨주셨네요.
요청하신 분의 닉네임이 기억은 안 나지만 맹글어 주셨으니 적용해 보았습니다.
▼ 팝업으로 선택 실행이 가능하니 클릭 실수로 종료되거나 재부팅되는 실수는 줄어들겠네요. ^^
- 첨부 :
- shutdown1.png [File Size:72.5KB/Download4]
- shutdown2.gif [File Size:637.0KB/Download9]
- shutdown3.png [File Size:90.4KB/Download4]
수고 많으셨습니다. 감사합니다.