📄 shutwm.cpp
字号:
// ShutWm.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "ShutWm.h"
#include <windows.h>
#include <commctrl.h>
//#include "pm.h"
#include "winioctl.h"
#define MAX_LOADSTRING 100
#define ID_TRAY 1000
#define WM_TRAY_NOTIFY (WM_USER + 100)
#define MENU_OFFSCREEN 1
#define MENU_RESET 2
#define MENU_SHUTDOWN 3
#define MENU_EXIT 4
#define MENU_AUTORUN 5
#define IOCTL_HAL_REBOOT CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
// 全局变量:
HINSTANCE g_hInst = NULL; // 当前实例
HMENU g_hMenu = NULL; // 弹出菜单
HICON g_hIcon = NULL; // 托盘图标
BOOL g_bAutoRun = FALSE; //是否开机启动
TCHAR g_tszAppPath[MAX_PATH] = {0}; // 程序路径
TCHAR g_tszLinkPath[MAX_PATH] = _T("\\Windows\\StartUp\\ShutWM.lnk");
// 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE, LPTSTR);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
BOOL TrayMessage(HWND hwnd, UINT uMsg, UINT uID, HICON hIcon);
BOOL AppLinkExist();
void GenKeyEvent(BYTE bVkCode);
extern "C" __declspec(dllimport) BOOL KernelIoControl(
DWORD dwIoControlCode,
LPVOID lpInBuf,
DWORD nInBufSize,
LPVOID lpOutBuf,
DWORD nOutBufSize,
LPDWORD lpBytesReturned);
//extern "C" __declspec(dllimport) void FileSystemPowerFunction();
//extern "C" __declspec(dllimport) void PowerOffSystem();
//extern "C" BOOL ExitWindowsEx(UINT uFlags, DWORD dwReason);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
// 执行应用程序初始化:
if (!InitInstance(hInstance, nCmdShow))
{
return FALSE;
}
// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)
{
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = g_hIcon;
wc.hCursor = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = szWindowClass;
return RegisterClass(&wc);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd = NULL;
TCHAR szTitle[MAX_LOADSTRING] = _T("ShutWM_sky"); // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING] = _T("ShutWM_yks"); // 主窗口类名
g_hInst = hInstance; // 将实例句柄存储在全局变量中
g_hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SHUTWM));
// 在应用程序初始化期间,应调用一次 SHInitExtraControls 以初始化
// 所有设备特定控件,例如,CAPEDIT 和 SIPPREF。
//SHInitExtraControls();
//如果它已经在运行,则将焦点置于窗口上,然后退出
hWnd = FindWindow(szWindowClass, szTitle);
if (hWnd)
{
// 将焦点置于最前面的子窗口
// “| 0x00000001”用于将所有附属窗口置于前台并
// 激活这些窗口。
//SetForegroundWindow((HWND)((ULONG) hWnd | 0x00000001));
return FALSE;
}
if (!MyRegisterClass(hInstance, szWindowClass))
{
return FALSE;
}
hWnd = CreateWindow(szWindowClass, szTitle, ~WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
//int wmId, wmEvent;
switch (message)
{
case WM_COMMAND:
{
//wmId = LOWORD(wParam);
//wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (LOWORD(wParam))
{
case MENU_OFFSCREEN:
{
//GenKeyEvent(VK_F22);//锁屏keylock
GenKeyEvent(VK_OFF);//关屏,会断开AcitveSync
break;
}
case MENU_RESET:
{
//SetSystemPowerState(NULL, POWER_STATE_RESET, POWER_FORCE);//可以用
KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL);//可以用
//FileSystemPowerFunction();//和下面一行一起使用
//PowerOffSystem();//暂不可以用
//ExitWindowsEx(EWX_REBOOT, 0);//可以用
break;
}
case MENU_SHUTDOWN:
{
//只是关屏,没有关机
//SetSystemPowerState(NULL, POWER_STATE_OFF, POWER_FORCE);
//ExitWindowsEx(EWX_POWEROFF, 0);
break;
}
case MENU_EXIT:
{
SendMessage(hWnd, WM_CLOSE, 0, 0);
break;
}
case MENU_AUTORUN:
{
if (g_bAutoRun)
{
if (DeleteFile(g_tszLinkPath))
{
g_bAutoRun = FALSE;
}
}
else
{
TCHAR tszTempAppPath[MAX_PATH] = {0};
wsprintf(tszTempAppPath, _T("\"%s\""), g_tszAppPath);
if (SHCreateShortcut(g_tszLinkPath, tszTempAppPath))
{
g_bAutoRun = TRUE;
}
}
CheckMenuItem(g_hMenu, MENU_AUTORUN, g_bAutoRun?MF_CHECKED:MF_UNCHECKED);
break;
}
default:
{
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
}
case WM_CREATE:
{
GetModuleFileName(NULL, g_tszAppPath, MAX_PATH);
g_hMenu = CreatePopupMenu();
AppendMenu(g_hMenu, MF_STRING, MENU_OFFSCREEN, _T("关屏"));
AppendMenu(g_hMenu, MF_STRING, MENU_RESET, _T("重启"));
//AppendMenu(g_hMenu, MF_STRING, MENU_SHUTDOWN, _T("关机"));
AppendMenu(g_hMenu, MF_STRING, MENU_EXIT, _T("退出"));
AppendMenu(g_hMenu, MF_SEPARATOR, NULL, _T(""));
UINT uFlag = MF_STRING;
if (AppLinkExist())
{
g_bAutoRun = TRUE;
uFlag |= MF_CHECKED;
}
else
{
g_bAutoRun = FALSE;
uFlag |= MF_UNCHECKED;
}
AppendMenu(g_hMenu, uFlag, MENU_AUTORUN, _T("开机启动"));
TrayMessage(hWnd, NIM_ADD, ID_TRAY, g_hIcon);
break;
}
case WM_DESTROY:
{
DestroyMenu(g_hMenu);
TrayMessage(hWnd, NIM_DELETE, ID_TRAY, g_hIcon);
PostQuitMessage(0);
break;
}
case WM_TRAY_NOTIFY:
{
if (ID_TRAY == wParam && WM_LBUTTONUP == lParam)
{
TrackPopupMenu(g_hMenu, TPM_BOTTOMALIGN, GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN), 0, hWnd, NULL);
}
break;
}
default:
{
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
return 0;
}
BOOL TrayMessage(HWND hwnd, UINT uMsg, UINT uID, HICON hIcon)
{
NOTIFYICONDATA nid;
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hwnd;
nid.uID = uID;
nid.uFlags = NIF_MESSAGE|NIF_ICON;
nid.uCallbackMessage = WM_TRAY_NOTIFY;
nid.hIcon = hIcon;
nid.szTip[0] = '\0';
return Shell_NotifyIcon(uMsg, &nid);
}
BOOL AppLinkExist()
{
BOOL bExist = FALSE;
TCHAR tszLinkPath[MAX_PATH] = {0};
TCHAR tszTargetPath[MAX_PATH] = {0};
TCHAR tszTempApppath[MAX_PATH] = {0};
wsprintf(tszTempApppath, _T("\"%s\""), g_tszAppPath);
WIN32_FIND_DATA findData;
HANDLE hFile;
BOOL bFindFile = FALSE;
DWORD dwErrorCode = 0;
SetLastError(dwErrorCode);
hFile = FindFirstFile(_T("\\Windows\\StartUp\\*.lnk"), &findData);
while (INVALID_HANDLE_VALUE != hFile)
{
wsprintf(tszLinkPath, _T("%s%s"), _T("\\Windows\\StartUp\\"), findData.cFileName);
if (SHGetShortcutTarget(tszLinkPath, tszTargetPath, MAX_PATH))
{
if (0 == lstrcmp(tszTempApppath, tszTargetPath))
{
wcsncpy(g_tszLinkPath, tszLinkPath, MAX_PATH);
bExist = TRUE;
break;
}
}
bFindFile = FindNextFile(hFile, &findData);
if (!bFindFile)
{
dwErrorCode = GetLastError();
if (ERROR_NO_MORE_FILES == dwErrorCode)
{
break;
}
}
}
FindClose(hFile);
return bExist;
}
void GenKeyEvent(BYTE bVkCode)
{
keybd_event(bVkCode, 0, KEYEVENTF_SILENT, 0);
Sleep(100);
keybd_event(bVkCode, 0, KEYEVENTF_SILENT | KEYEVENTF_KEYUP, 0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -