程序控制桌面切换

创建一个简易的虚拟桌面 文字性的描述留到后续文章再交代,还是先放一个小小的'大招',毕竟眼镜看见的东西,比起抽象的东西,更能引起初学者的注意, 如果你对这个感兴趣的话,这里有个链接,你可以去看看, >                  http://bbs.pediy.com/showthread.php?t=173271 1.用vs2013创建一个空项目,添加一个cpp文件, #include T 阅读详情

用向导建立一个Win32程序“hello, world!”,然后用下面的内容替换整个CPP文件内容就可以了


#include "stdafx.h"
#include "resource.h"

#include "ShellApi.h"

HINSTANCE hInst = NULL;

HDESK hDesktopCurrent;
HDESK hDesktopLlx;

LONG APIENTRY WndProc(
    HWND hWnd,
    UINT message,      // type of message
    WPARAM wParam,     // additional information
    LPARAM lParam)     // additional information
{
 int wmId, wmEvent;
 PAINTSTRUCT ps;
 HDC hdc;

 switch (message)
 {
  case WM_COMMAND:
   wmId    = LOWORD(wParam);
   wmEvent = HIWORD(wParam);
   // Parse the menu selections:
   switch (wmId)
   {
    case IDM_ABOUT:
       //DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
       break;
    case IDM_EXIT:
       DestroyWindow(hWnd);
       break;
    default:
       return DefWindowProc(hWnd, message, wParam, lParam);
   }
   break;
  case WM_PAINT:
   hdc = BeginPaint(hWnd, &ps);
   // TODO: Add any drawing code here...
   RECT rt;
   GetClientRect(hWnd, &rt);
   //DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
   EndPaint(hWnd, &ps);
   break;
  /*
  case WM_DESTROY:
   PostQuitMessage(0);
   break;
  //*/
  case WM_LBUTTONDOWN:
   break;
  case WM_HOTKEY:
   if(7777 == wParam)
   {
    PostQuitMessage(0);
   }
   else if(7778 == wParam)
   {
    SwitchDesktop(hDesktopCurrent);
   }
   else if(7779 == wParam)
   {
    SwitchDesktop(hDesktopLlx);
   }
   break;
  case WM_QUIT:
  case WM_DESTROY:
   SwitchDesktop(hDesktopCurrent);
   return DefWindowProc(hWnd, message, wParam, lParam);
  default:
   return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}

void StartMyExplore(void)
{
 STARTUPINFO sui;         // Process startup info
 PROCESS_INFORMATION pi;  // info returned from CreateProcess
 //
 // Most sui members will be 0
 //
 ZeroMemory ((PVOID)&sui, sizeof(sui));

 sui.cb = sizeof (sui);
 //
 // Need the lpDesktop member so the new process runs on this desktop
 // The lpDesktop member was reserved in previous versions of NT
 //
 sui.lpDesktop = _T("llx");
 CreateProcess (NULL,   // image name
      "explorer", // command line
      NULL,   // process security attributes
      NULL,   // thread security attributes
      TRUE,   // inherit handles
      CREATE_DEFAULT_ERROR_MODE|CREATE_SEPARATE_WOW_VDM,
      NULL,   // environment block
      NULL,   // current directory
      &sui,   // STARTUPINFO
      &pi);   // PROCESS_INFORMATION
}

int CALLBACK WinMain( HINSTANCE hInstance,
      HINSTANCE hPrevInstance,
      LPSTR lpCmdLine,
      int nCmdShow)
{
 WNDCLASS wc;
 wc.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
 wc.lpfnWndProc = WndProc;
 wc.cbClsExtra = 0;
 wc.cbWndExtra = 0;
 wc.hInstance = hInstance;
 wc.hIcon = LoadIcon (NULL, "IDI_SETTHREADDESKTOP");
 wc.hCursor = LoadCursor (NULL, IDC_ARROW);
 wc.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);
 wc.lpszMenuName = NULL;
 wc.lpszClassName = "lilinxiang";
 if(!RegisterClass(&wc))
 {
  return TRUE;
 }

 hDesktopCurrent = NULL;
 hDesktopCurrent = GetThreadDesktop(GetCurrentThreadId());

 hDesktopLlx = NULL;
 hDesktopLlx = OpenDesktop("llx", 0, FALSE, NULL);
    if (hDesktopLlx != NULL)
 {
  CloseDesktop(hDesktopLlx);
 }

 SECURITY_ATTRIBUTES sa;
 sa.bInheritHandle = TRUE;
 sa.nLength = sizeof(SECURITY_ATTRIBUTES);
 sa.lpSecurityDescriptor = NULL;

 hDesktopLlx = CreateDesktop("llx", NULL,
                                    NULL,0,MAXIMUM_ALLOWED,
                                    NULL);
 if(hDesktopLlx == NULL)
 {
  return 0;
 }

 if(!SetThreadDesktop(hDesktopLlx))
 {
  char szError[256] = {0};
  ltoa( (long)(GetLastError()) , szError, 10);
 }
 SwitchDesktop(hDesktopLlx);

 HWND hWnd = NULL;
 hWnd = CreateWindow ("lilinxiang",
        "hello, world!",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        0,
        CW_USEDEFAULT,
        0,
        NULL,
        NULL,
        hInstance,
        NULL
        );
 if(NULL == hWnd)
 {
  return TRUE;
 }

 //register hotkey for exit this desktop or switch to another desktop
 //ShowWindow(hWnd, SW_SHOW);
 //UpdateWindow(hWnd);
 if(!RegisterHotKey(hWnd, 7777, MOD_CONTROL, 'Q'))
 {//exit process
  return TRUE;
 }
 if(!RegisterHotKey(hWnd, 7778, MOD_CONTROL | MOD_SHIFT, 'Q'))
 {//switch to new desktop
  return TRUE;
 }
 if(!RegisterHotKey(hWnd, 7779, MOD_CONTROL | MOD_SHIFT, 'W'))
 {//switch to original desktop
  return TRUE;
 }
 
 StartMyExplore();

 MSG msg;
 while (GetMessage(&msg, NULL,  0, 0))
    {
                 TranslateMessage(&msg);// Translates virtual key codes
                 DispatchMessage(&msg); // Dispatches message to window
    }

 SwitchDesktop(hDesktopCurrent);
 return TRUE;
}


//   : )  好东西噢

用CreateDesktop新建一个桌面,什么都没有的桌面,然后在新桌面环境中运行了explorer所以就有了和windows一样功能的桌面,这个时候你就有了两个桌面了,下面要做的就是用SwitchDesktop切换不同的桌面了

在不同桌面中打开的程序在其他桌面的任务栏包括系统托盘上不可见,不过任务管理器中还是可见的这样你就非常方便的做很多事了,很多...  而且还可以非常快的转到正常状态上可以让会责骂你的人比如老板什么的无话可说,因为他们什么也看不到  : )

或者你也可以给你用户定制一个个性化的桌面。改改上面的代码可以得到你要的效果的。

好东西吧,还不帮我顶!!!!!!!  : )

按键切换多个应用程序窗口的编程方法 这样的功能可以提高用户体验,使他们可以轻松地在不同的应用程序之间进行切换,而无需使用鼠标或其他复杂的操作。当用户按下Alt键时,我们将检测到该按键的按下事件,并执行相应的切换操作。现在,我们可以编写一个主循环来监听Alt键的按下事件,并在按下Alt键时执行窗口切换操作。需要注意的是,上述代码片段仅演示了如何监听Alt键的按下事件和获取当前活动窗口的标题。具体的窗口切换逻辑需要根据你的应用程序的需求来实现。总结起来,要实现按键切换多个应用程序窗口的功能,你需要选择一个合适的按键来触发切换操作,使用。 阅读详情

相关推荐

【实战篇导读】四足机器人运动控制导读

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对四足机器人运动运动控制系统及相关算法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章主要介绍了波士顿spot机器人的发展历史、四足机器人的硬件系统及电机执行器组成包括硬件系统、关节电机执行器,机载传感器机处理器及电气连接等。概述了四足机器人规划控制、感知、定位及局部地图的相关算法方向。

qq_35635374的博客 623

开源项目推荐:Switch-Desktop

开源项目推荐:Switch-Desktop Switch-Desktop 是一个开源项目,旨在通过键盘驱动的命令来快速导航您的应用程序。该项目主要使用 TypeScript、SCSS、JavaScript 和 HTML 等编程语言进行开发。 项目基础介绍 Switch-Desktop 的目的是为了让用户能够更加高效地在多个应用程序之间切换。它通过提供一个简洁的 UI 界面(Switch deskt...

gitblog_00750的博客 515

数据分析必问:Pandas面试题及参考答案

DataFrame是Pandas库中的一个核心数据结构,它类似于Excel中的表格,可以存储不同类型的数据。在Pandas中,抽样操作通常很简单,但是需要根据数据的特点和分析的需求来选择合适的抽样方法。数据标准化和归一化是数据预处理中常用的技术,目的是将数据调整到一个合适的范围内,以消除不同特征量纲和数值范围的差异,从而保证模型训练的有效性。CSV文件是一种文本文件,其中的数据以逗号分隔。不平衡数据集指的是数据集中各类别样本的数量差异较大的情况,这可能导致模型训练出现偏差,影响模型的泛化能力。

大模型大数据攻城狮的专栏 2967

Windows任务管理器开发原理与实现

   说了这么多,我们也该谈谈如何实现了。   1.窗口信息  MS为我们提供了打开特定桌面和枚举桌面窗口的函数。  hDesk=OpenDesktop(lpszDesktop,0,FALSE,DESKTOP_ENUMERATE);  //打开我们默认的Default桌面;  EnumDesktopWindows(hDesk,(WNDENUMPROC)EnumWindowProc,0);  //枚

xgbing 2681

开源项目教程:Switch Desktop 使用指南

开源项目教程:Switch Desktop 使用指南 1. 项目介绍 Switch Desktop 是一个由 ahkohd 开发的开源工具,旨在简化桌面环境之间的切换过程。它为那些在多个操作系统或窗口管理器中频繁工作的人提供了高效的方式来配置和切换他们的工作环境。通过自定义脚本和配置,用户能够实现快捷的环境迁移,从而提升多平台开发的流畅性与便捷性。 2. 项目快速启动 要快速启动 Switch D...

gitblog_00493的博客 788

junit.framework.TestCase

 8.1  JUnit介绍JUnit是一个开源的Java单元测试框架,由 Erich Gamma 和 Kent Beck 开发完成。8.1.1  JUnit简介JUnit主要用来帮助开发人员进行Java的单元测试,其设计非常小巧,但功能却非常强大。下面是JUnit一些特性的总结:— 提供的API可以让开发人员写出测试结果明确的可重用单元测试用例。— 提供了多种方式来显示

java 是个什么玩意 1万+

JUnit写TestCase

<br />junit是java中书写unit test的framework,目前一些流行的unit test工具大都都是在junit上扩展而来的。<br />Eclipse中配置junit<br />在要使用JUNIT的project名上,点击properties--java build path-libraries, 点击Add External JARs,把JUNIT包点上就行了. 并在需要测试的项目上新建junit test case<br /> <br /> <br />用法<br />1.基本使

Kevin‘s blog 8787

JUnit 测试

简介: JUnit是一个java语言的单元测试框架。所谓单元测试是测试应用程序的功能是否能够按需要正常运行。单元测试是一个对单一实体(类或方法)的测试。多数Java的开发工具都集成了JUnit单元测试工具。 特点: JUnit是一个开放的资源框架,用于编写和运行测试。 JUnit有效提高代码质量。 提供注释来识别测试方法。 提供断言来测试预期结果。 提供测试运行来运行测试。 系统要求...

weixin_41557632的博客 1085

详解junit

相信我,进来看看,一文完全掌握junit单元测试

BugMan的博客 2220

junit开源测试框架学习笔记一探寻junit基本组件TestCase、TestSuite、TestRunner和TestListener

还记得培训半路出家来搞JAVA的时候,老师讲的第一个开源框架就是junit,当时觉得是还挺好用的,在myeclipse中右键单击一下,对于按照juni规定格式的方法就会运行,并判断是否和断言也就是你预期的效果是否一致。当时,觉得挺没用的,不就是断言吗,就是得到一个预期的结果,我打个断电点不也一样。现在回想自己以前有的时候还是真的挺搞笑的,有多少人就是忽略了细节鄙夷小事情,如此积月累下来,给自己带来

程序猿杨欣 1942

Junit测试的使用场景,这里带来2个非常实用的案例

/每写入一行,在该行开头添(加序号.),例如1.for (String s : list) {//每遍历一次,向user.txt文件写入一行。//当前项目下user.txt文件,不是模块下,因为默认下的路径就是项目根目录。//为了不影响user.txt文件,所以需要把源文件进行拷贝。//为了把数据按行进行存储,所以声明一个集合进行有序的存储。bw.flush();//读取创建一个字节读流,关联user.txt文件。//执行完操作后恢复被操作的文件user.txt。//关联userCopy.txt文件,

2501_90251053的博客 631

Eclipse下建立junit测试

如今的项目中越来越注重测试,单元测试更是必不可少,JUnit是一个功能非常强大的工具包,可以对一个/多个类的一个/多个方法进行测试,使用JUnit建立单元测试方法很简单,自己动手做了一个示例。

海洋之心 2420

java testcase类_JUnit 写 TestCase

junit是java中书写unit test的framework,目前一些流行的unit test工具大都都是在junit上扩展而来的。目前它的版本是junit3.8.1,可以从www.junit.org上下载。Eclipse中配置junit在要使用JUNIT的project名上,点击properties--java build path-libraries, 点击Add External JAR...

weixin_39548541的博客 976

Junit学习笔记之一:junit的安装和测试原则

单元测试    1、自动化测试      1.1、通过断言的方式来确定结果是否正确Assert      1.2、引入junit的jar包      1.3、创建一个操作类    2、基于测试开发的方式和优点    3、stub和mock    4、在容器中测试       4.1、jetty       4.2、catcus    5、dbunit junit的安装

xiao_xuwen的博客 895

TestCase和TestSuite详解

一、TestCast和TestSuite概念介绍 TestCase:字面意思,测试用例。为一个或多个方法提供测试方法,一般是一个test。 TestSuite:测试集合,即一组测试。一个test suite是把多个相关测试归入一组的快捷方式。如果自己没有定义,Junit会自动提供一个test suite ,包括TestCase中的所有测试。 TestRunner:测试运行器。执...

a7412605567的博客 3394

junit源码学习-交织的TestCase和TestResult

TestCase中实例化了TestResult,并将自身化为参数调用TestResult的run方法 TestCase.java/**  * Creates a default TestResult object  * 生成TestResult实例,单独开方法的原因我猜是有可能使用者自己继承或者实现TestCase和TestResult,  * 那么直接重写这个方法就行了  * @

songry的专栏 3198

TestCase与TestSuite

背景:在看apache commons-validator源码包时,发现测试用例继承了TestCase,这里总结一下。 两者都位于junit.framework包下且都实现了Test接口,功能相近,区别是前者只能运行一个test,后者可以运行多个test。 Test: 该接口有两个待实现方法,分别是countTestCases()和run(TestResult) TestCase: 该类接收...

harbor_lee的博客 2001

在Eclipse中使用JUnit进行单元测试

如何编写测试代码肯定是开发人员最头疼的。JUnit是一个非常强大的单元测试包,可以对一个/多个类的单个/多个方法测试,还可以将不同的TestCase组合成TestSuit,使测试任务自动化。本文简单介绍如何在eclipse中使用JUnit创建一个TestCase来测试一个简单的类。我们写一个要测试的类Simple如下:package jexi.test;public class

Goldly的专栏 4395

Junit测试中找不到junit.framework.testcase

在使用Junit进行测试时,出现如下问题:找不到junit.framework.testcase 解决方法:选中项目->属性->Java构建路径->库->添加外部jar在eclipse的安装目录中找到eclipse/plugins/org.junit_3.8.1/junit.jar添加上就可以了。  

记录成长的每一步 1万+

@Test注解与继承TestCase混用问题及原因

前言 在作单元测试的时候,可能使用@Test注解执行一个测试用例,或者测试类继承junit.framework.TestCase,方法名为test前缀执行测试用例,如下: 1. 使用@Test注解 public class Junit4Test { @Test public void testX() { Assert.assertEquals(0, 0);...

程序猿的樊笼 3411

ANSYS仿真分析-高超音速飞行器外流场分析(文档及模型数据等).zip

ANSYS仿真分析-高超音速飞行器外流场分析(文档及模型数据等).zip

上一篇: 如何扫描网络邻居内的所有IP和用户名
下一篇: 测试爱情气质
foxmail
博客等级 码龄25年 11粉丝 92原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值