#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#include "resource.h"
HINSTANCE g_hInst;
HWND g_hMainWnd;
HDESK hvirtualDesk[10]; //虚拟桌面句柄
PROCESS_INFORMATION pi; //计算器进程信息
NOTIFYICONDATA NotifyIcon;
DWORD dwIconID;
#define WM_ICON WM_USER+101
#define IDM_EXIT WM_USER+1001
void RunExplorer(char *szVDesktopName)
{
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.lpDesktop = szVDesktopName;
ZeroMemory(&pi, sizeof(pi));
if (!CreateProcess(NULL, "explorer", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
MessageBox(NULL, "运行文件管理器失败", "Error", 0);//在项目--属性--常规---字符集如果是unicode是宽字节符,需要L""
ExitProcess(1);
}
}
//在虚拟桌面上运行一个计算器的实例
void RunCalc(char * szVDesktopName)
{
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.lpDesktop = szVDesktopName;
ZeroMemory(&pi, sizeof(pi));
if (!CreateProcess(NULL, "cmd", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
MessageBox(NULL, "运行cmd失败", "Error", 0);
ExitProcess(1);
}
//TCHAR cmdline[] = TEXT("c://program files//internet explorer//iexplore.exe http://community.csdn.net/");
//if (!CreateProcess(NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
//{
// MessageBox(NULL, "运行360浏览器失败", "Error", 0);
// ExitProcess(1);
//}
if (!CreateProcess(NULL, "calc", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
MessageBox(NULL, "运行计算器失败", "Error", 0);
ExitProcess(1);
}
}
void OnStartVDesktop(HWND hWnd)
{
MessageBox(hWnd, "启动虚拟桌面成功", "information", MB_OK | MB_ICONINFORMATION);
char szVDesktopName[30];
for (int i = 1; i < 10; i++)
{
RtlZeroMemory(szVDesktopName, 30);
sprintf_s(szVDesktopName, 30, "myDesktop%d", i);
hvirtualDesk[i] = CreateDesktopA(szVDesktopName, NULL, NULL, DF_ALLOWOTHERACCOUNTHOOK, GENERIC_ALL, NULL);
RunExplorer(szVDesktopName);//启动任务管理器
RunCalc(szVDesktopName);//在虚拟桌面启动应用程序
}
ShowWindow(hWnd, SW_HIDE);//隐藏程序主窗口
return;
}
//注册系统热键的响应的处理函数
void OnHotKey(HWND hWnd, int n)
{
SwitchDesktop(hvirtualDesk[n]);
SetThreadDesktop(hvirtualDesk[n]);
UpdateWindow(hWnd);
return;
}
BOOL CALLBACK CloseDesktopWindows(HWND hWnd, LPARAM lParam)
{
DWORD dwTargetPID;
::GetWindowThreadProcessId(hWnd, &dwTargetPID);
HANDLE hTarget = OpenProcess(PROCESS_ALL_ACCESS, false, dwTargetPID);
printf("find hWnd = %08X pid = %08d HANDLE = %08X\n", hWnd, dwTargetPID, hTarget);
TerminateProcess(hTarget, 1);
return true;
}
void OnClose(HWND hWnd)
{
memset(&NotifyIcon, 0, sizeof(NOTIFYICONDATA));
NotifyIcon.hWnd = g_hMainWnd;
NotifyIcon.uID = dwIconID;
Shell_NotifyIcon(NIM_DELETE, &NotifyIcon);
// TerminateProcess( pi.hProcess, 1 );
for (int i = 1; i < 10 && hvirtualDesk[i]; i++)
{
EnumDesktopWindows(hvirtualDesk[i], CloseDesktopWindows, 0);
CloseDesktop(hvirtualDesk[i]);
}
DestroyWindow(hWnd);
PostQuitMessage(0);
return;
}
// 功能 : 初始化对话框时调用
// 参数 : hWnd 窗口句柄
// 返回值 : 初始化操作是否成功
BOOL OnInitDialog(HWND hWnd)
{
for (int i = 0; i < 10; i++)
{
hvirtualDesk[i] = 0;
}
hvirtualDesk[0] = GetThreadDesktop(GetCurrentThreadId());
for (int i = 0; i < 10; i++)
{
char szBuf[MAX_PATH];
sprintf_s(szBuf, MAX_PATH, "HXBX Virtual Desktop %d", i);
DWORD ret = RegisterHotKey(hWnd, 0, MOD_CONTROL | MOD_ALT, 0x30 + i);
if (ret == 0)
{
sprintf_s(szBuf, "注册系统热键 Ctrl+Alt+%d 失败", i);
MessageBoxA(hWnd, szBuf, 0, 0);
PostQuitMessage(0);
}
}
// 建立托盘图标
NotifyIcon.cbSize = sizeof(NOTIFYICONDATA);
NotifyIcon.hIcon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_ICON1));
NotifyIcon.hWnd = hWnd;
strcpy(NotifyIcon.szTip, "寒雪冰熊--多桌面管理系统");
NotifyIcon.uCallbackMessage = WM_ICON;
dwIconID = GlobalAddAtom("HXBX Virtual Desktop");
NotifyIcon.uID = dwIconID;
NotifyIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
Shell_NotifyIcon(NIM_ADD, &NotifyIcon);
return TRUE;
}
INT_PTR CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
g_hMainWnd = hWnd;
OnInitDialog(hWnd);
break;
case WM_HOTKEY:
if (LOWORD(lParam) == (MOD_CONTROL | MOD_ALT))
{
OnHotKey(hWnd, HIWORD(lParam) - 0x30);
}
break;
// 托盘响应消息
case WM_ICON:
if (lParam == WM_RBUTTONUP)
{
SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SW_SHOW);
SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SW_SHOW);
HMENU hMenu = CreatePopupMenu();
AppendMenu(hMenu, MF_STRING, IDM_EXIT, "退出");
POINT point;
GetCursorPos(&point);
TrackPopupMenu(hMenu, TPM_RIGHTALIGN, point.x, point.y, 0, hWnd, NULL);
::PostMessage(hWnd, WM_NULL, 0, 0);
return TRUE;
}
else if (lParam == WM_LBUTTONUP)
{
ShowWindow(hWnd, SW_SHOW);
}
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDM_EXIT:
SendMessage(hWnd, WM_CLOSE, 0, 0);
break;
case IDC_BUTTON1:
OnStartVDesktop(hWnd);
break;
default:
break;
}
return TRUE;
case WM_DESTROY:
OnClose(hWnd);
PostQuitMessage(0);
case WM_CLOSE:
OnClose(hWnd);
PostQuitMessage(0);
return TRUE;
default:
return FALSE;
}
return FALSE;
}
//提升本地进程的权限,才可以打开和结束相应的进程
BOOL EnablePriv()
{
HANDLE hToken;
//令牌 Token
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
{
TOKEN_PRIVILEGES tkp;
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid);
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
tkp.PrivilegeCount = 1;
AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL);
return true;
}
return false;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
EnablePriv();//程序开始前先获取提升进程权限,才可以操作其他进程
if (AttachConsole(-1) != 0)
{
freopen("conin$", "r+t", stdin);
freopen("conout$", "w+t", stdout);
freopen("conout$", "w+t", stderr);
}
g_hInst = hInstance;
g_hMainWnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), GetDesktopWindow(), DlgProc);
if (g_hMainWnd == 0)
{
return -1;
}
RECT wndRect;
GetWindowRect(g_hMainWnd, &wndRect);
int nScreenX = GetSystemMetrics(SM_CXSCREEN);
int nScreeny = GetSystemMetrics(SM_CYSCREEN);
SetWindowPos(g_hMainWnd, HWND_TOP, nScreenX / 2 - (wndRect.right - wndRect.left) / 2,
nScreeny / 2 - (wndRect.bottom - wndRect.top) / 2, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
虚拟化程序多桌面软件工具C++源码 成品 偷懒神器 切换不同虚拟桌面
需积分: 9 160 浏览量
2017-04-21
10:26:07
上传
评论 1
收藏 59KB RAR 举报
huangmeixiong
- 粉丝: 5
- 资源: 6
最新资源
- SRS-CentOS7-x86-64-5.0-r1.zip
- 全文检索使用ElasticSearch实现全文检索的详细说明和实践探索
- Python《基于TensorFlow的人脸识别(面部表情识别)卷积神经网络 》+源代码+文档说明
- Python《利用bert预训练的中文模型进行文本分类 数据集中文情感分析语料》+源代码+文档说明
- Keil MDK主题美化和代码美化
- 《单片机PID算法的恒温控制系统仿真与程序源码设计(DS18B20传感器) 》+源代码
- 基于matlab小波变换图像压缩系统代码15
- 基于matlab主成分分析图像压缩重建系统代码14
- C语言《基于AT89C52单片机搭建的PID直流电机控制程序,主要用于Proteus电路仿真》+源代码
- C++《基于规划和汽车动力学的自动驾驶项目仿真(基于ROS的自动驾驶项目仿真,使用DWA路径规划算法和双PID控制器)》+源代码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈