스크린 샷

제목 : 무*님 HotKey용 64비트 종료창

네트워크빌런

-1.png

 

무*님이 올려주신 HotKey 자료에 셧다운 버튼 누르면 확인 창이 떴으면 좋겠다는 한 회원분의 댓글에 위 스샷과 같은 종료 창 프로그램을 64비트용으로 구해다가 주시면 반영하겠다는 댓글이 생각나서 C언어로 급조해서 올립니다. 하는 일은 99% 똑같습니다 ^^ shutdown.exe

 

-2.png

 

요 밑에서부터는 궁금하신 분들만 =======

우선 소스 코드는 아래와 같습니다.

#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)를 먹여줘야 하는데 이것도 궁금하신 분들만 ^^

1.png

 

2.png

 

3.png

 

4.png

 

5.png

 

6.png

 

 

감사합니다 ^^

 

댓글 [4]

cungice

2023.05.11
23:46:44

수고 많으셨습니다. 감사합니다.

개골구리

2023.05.12
01:01:07

수고 많으셨습니다

무월

2023.05.12
05:06:53

자유게시판에 뼈대 ISO 잠시 나눔하면서 올렸다가 게시글을 지웠는데 기억하시고 남겨주셨네요.

요청하신 분의 닉네임이 기억은 안 나지만 맹글어 주셨으니 적용해 보았습니다.

 

shutdown3.png

shutdown1.png

 

▼ 팝업으로 선택 실행이 가능하니 클릭 실수로 종료되거나 재부팅되는 실수는 줄어들겠네요. ^^

 

shutdown2.gif

첨부 :
shutdown1.png [File Size:72.5KB/Download4]
shutdown2.gif [File Size:637.0KB/Download9]
shutdown3.png [File Size:90.4KB/Download4]

쌍무지개

2023.05.12
09:37:58

수고하셨습니다...!~~

List of Articles
[공지] 스크린샷 업로드 유의사항 3
XE1.11.6 Layout1.4.8