1. 函数原型:
  2. BOOL WINAPI SystemParametersInfo(
  3. _In_ UINT uiAction,
  4. _In_ UINT uiParam,
  5. _Inout_ PVOID pvParam,
  6. _In_ UINT fWinIni
  7. );
  8. //函数 MSDN链接:https://msdn.microsoft.com/en-us/library/ms724947(v=vs.85).aspx
  1. 用法:
  2. UINT nPreviousState;
  3. //禁止任务切换
  4. SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,TRUE,&nPreviousState,)
  5.  
  6. //允许任务切换
  7. SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,FALSE,&nPreviousState,);

代码示例:

  1. // DisableChangeTask.cpp : 定义应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "DisableChangeTask.h"
  6.  
  7. #define MAX_LOADSTRING 100
  8. typedef struct _DLONG
  9. {
  10. LONG wParam;
  11. LONG lParam;
  12. }DLONG;
  13.  
  14. // 全局变量:
  15. HINSTANCE hInst; // 当前实例
  16. WCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
  17. WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
  18.  
  19. // 此代码模块中包含的函数的前向声明:
  20. ATOM MyRegisterClass(HINSTANCE hInstance);
  21. BOOL InitInstance(HINSTANCE, int);
  22. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  23. INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
  24.  
  25. //MyFunction,就是用这个函数来处理消息
  26. BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);
  27.  
  28. int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
  29. _In_opt_ HINSTANCE hPrevInstance,
  30. _In_ LPWSTR lpCmdLine,
  31. _In_ int nCmdShow)
  32. {
  33. UNREFERENCED_PARAMETER(hPrevInstance);
  34. UNREFERENCED_PARAMETER(lpCmdLine);
  35. if (lpCmdLine != NULL)
  36. {
  37. if (lstrlen(lpCmdLine) >= ) {
  38. MessageBox(NULL, lpCmdLine, TEXT("This is the cmdline"), MB_OK);
  39. }
  40. }
  41.  
  42. // TODO: 在此放置代码。
  43.  
  44. // 初始化全局字符串
  45. LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  46. LoadStringW(hInstance, IDC_DISABLECHANGETASK, szWindowClass, MAX_LOADSTRING);
  47. MyRegisterClass(hInstance);
  48.  
  49. // 执行应用程序初始化:
  50. if (!InitInstance (hInstance, nCmdShow))
  51. {
  52. return FALSE;
  53. }
  54.  
  55. HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_DISABLECHANGETASK));
  56.  
  57. MSG msg;
  58.  
  59. // 主消息循环:
  60. while (GetMessage(&msg, nullptr, , ))
  61. {
  62. if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  63. {
  64. TranslateMessage(&msg);
  65. DispatchMessage(&msg);
  66. }
  67. }
  68.  
  69. return (int) msg.wParam;
  70. }
  71.  
  72. //
  73. // 函数: MyRegisterClass()
  74. //
  75. // 目的: 注册窗口类。
  76. //
  77. ATOM MyRegisterClass(HINSTANCE hInstance)
  78. {
  79. WNDCLASSEXW wcex;
  80.  
  81. wcex.cbSize = sizeof(WNDCLASSEX);
  82.  
  83. wcex.style = CS_HREDRAW | CS_VREDRAW;
  84. wcex.lpfnWndProc = WndProc;
  85. wcex.cbClsExtra = ;
  86. wcex.cbWndExtra = ;
  87. wcex.hInstance = hInstance;
  88. wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_DISABLECHANGETASK));
  89. wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
  90. wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+);
  91. wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_DISABLECHANGETASK);
  92. wcex.lpszClassName = szWindowClass;
  93. wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
  94.  
  95. return RegisterClassExW(&wcex);
  96. }
  97.  
  98. //
  99. // 函数: InitInstance(HINSTANCE, int)
  100. //
  101. // 目的: 保存实例句柄并创建主窗口
  102. //
  103. // 注释:
  104. //
  105. // 在此函数中,我们在全局变量中保存实例句柄并
  106. // 创建和显示主程序窗口。
  107. //
  108. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  109. {
  110. hInst = hInstance; // 将实例句柄存储在全局变量中
  111.  
  112. HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  113. CW_USEDEFAULT, , CW_USEDEFAULT, , nullptr, nullptr, hInstance, nullptr);
  114.  
  115. if (!hWnd)
  116. {
  117. return FALSE;
  118. }
  119. /********************************my code goes here***************************/
  120. BOOL old;
  121. DLONG dlong;
  122. dlong.wParam = (WPARAM)hWnd;
  123. dlong.lParam = (LPARAM)FALSE;
  124. EnumWindows(EnumWindowsProc, (LONG)&dlong);
  125. //借助于屏幕保护程序欺骗操作系统禁止Alt+Tab/Esc
  126. SystemParametersInfo(SPI_SCREENSAVERRUNNING, TRUE, &old, );
  127. /********************************my code goes up there***********************/
  128.  
  129. ShowWindow(hWnd, nCmdShow);
  130. UpdateWindow(hWnd);
  131.  
  132. return TRUE;
  133. }
  134.  
  135. //
  136. // 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
  137. //
  138. // 目的: 处理主窗口的消息。
  139. //
  140. // WM_COMMAND - 处理应用程序菜单
  141. // WM_PAINT - 绘制主窗口
  142. // WM_DESTROY - 发送退出消息并返回
  143. //
  144. //
  145. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  146. {
  147. switch (message)
  148. {
  149. /*****************my code goes below***************/
  150. case WM_SYSCOMMAND:
  151. if (wParam == SC_MINIMIZE) return ;
  152. return DefWindowProc(hWnd, message, wParam, lParam);
  153. break;
  154. /*****************my code goes above***************/
  155. case WM_COMMAND:
  156. {
  157. int wmId = LOWORD(wParam);
  158. // 分析菜单选择:
  159. switch (wmId)
  160. {
  161. case IDM_ABOUT:
  162. DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
  163. break;
  164. case IDM_EXIT:
  165. DestroyWindow(hWnd);
  166. break;
  167. default:
  168. return DefWindowProc(hWnd, message, wParam, lParam);
  169. }
  170. }
  171. break;
  172. case WM_PAINT:
  173. {
  174. PAINTSTRUCT ps;
  175. HDC hdc = BeginPaint(hWnd, &ps);
  176. // TODO: 在此处添加使用 hdc 的任何绘图代码...
  177. EndPaint(hWnd, &ps);
  178. }
  179. break;
  180. case WM_DESTROY:
  181.  
  182. /*******当退出当前窗口是就允许任务切换了*********/
  183.  
  184. DLONG dlong;
  185. BOOL Old;
  186. dlong.lParam = (LPARAM)TRUE;
  187. dlong.wParam = (WPARAM)hWnd;
  188. EnumWindows(EnumWindowsProc, (LONG)&Old);
  189. SystemParametersInfo(SPI_SCREENSAVERRUNNING, FALSE, &Old, );
  190. /*******当退出当前窗口是就允许任务切换了*********/
  191. PostQuitMessage();
  192. break;
  193. default:
  194. return DefWindowProc(hWnd, message, wParam, lParam);
  195. }
  196. return ;
  197. }
  198.  
  199. // “关于”框的消息处理程序。
  200. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  201. {
  202. UNREFERENCED_PARAMETER(lParam);
  203. switch (message)
  204. {
  205. case WM_INITDIALOG:
  206. return (INT_PTR)TRUE;
  207.  
  208. case WM_COMMAND:
  209. if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  210. {
  211. EndDialog(hDlg, LOWORD(wParam));
  212. return (INT_PTR)TRUE;
  213. }
  214. break;
  215. }
  216. return (INT_PTR)FALSE;
  217. }
  218.  
  219. BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
  220. {
  221. DLONG *pDlong = (DLONG*)lParam;
  222. BOOL bEnable = (BOOL)pDlong->lParam;
  223. if (hwnd != (HWND)pDlong->wParam)
  224. EnableWindow(hwnd, bEnable);
  225. return TRUE;
  226. }

运行结果:如图,如果不关闭运行的界面,就无法切换到其他任务:

Windows API 编程-----Windows NT 环境下禁止任务切换的更多相关文章

  1. Windows系统在Python2.7环境下安装numpy, matplotlib, scipy - Lichanghao Blog

    numpy, matplotlib, scipy三个包是科学计算和绘图的利器.安装它们既可以在网上下载exe安装包,也可以用python内置的包管理工具来下载安装,后者较为方便. 这几天做美赛要用到, ...

  2. apache环境下禁止某文件夹内运行PHP脚本、禁止访问文件或目录执行权限的设置方法

    apache环境下禁止某文件夹内运行PHP脚本.禁止访问文件或目录执行权限的设置方法   首先我们来看两段对上传目录设置无权限的列子,配置如下: <Directory "要去掉PHP执 ...

  3. 浅谈Windows API编程

    WinSDK是编程中的传统难点,个人写的WinAPI程序也不少了,其实之所以难就难在每个调用的API都包含着Windows这个操作系统的潜规则或者是windows内部的运行机制…… WinSDK是编程 ...

  4. Azure REST API (4) 在Python环境下,使用Azure REST API

    <Windows Azure Platform 系列文章目录> 之前遇到的项目中,客户需要在Python环境下,监控Azure VM的CPU利用率,在这里简单记录一下. 笔者的环境是Win ...

  5. 【原创】Linux环境下的图形系统和AMD R600显卡编程(1)——Linux环境下的图形系统简介

    Linux/Unix环境下最早的图形系统是Xorg图形系统,Xorg图形系统通过扩展的方式以适应显卡和桌面图形发展的需要,然而随着软硬件的发展,特别是嵌入式系统的发展,Xorg显得庞大而落后.开源社区 ...

  6. Linux环境下的图形系统和AMD R600显卡编程(1)——Linux环境下的图形系统简介

    转:https://www.cnblogs.com/shoemaker/p/linux_graphics01.html Linux/Unix环境下最早的图形系统是Xorg图形系统,Xorg图形系统通过 ...

  7. Windows API 编程-----DLL编程之禁止加载自己

    和可执行文件一样,动态链接库也有自己的入口地址,如果系统或者当前进程的某个线程调用LoadLibrary函数加载或者使用FreeLibrary卸载该动态链接库的时候,会自动使用3个特定的堆栈参数跳转到 ...

  8. 宝塔 windows下apache环境下禁止某文件夹内运行PHP脚本、禁止访问文件

    首先我们来看两段对上传目录设置无权限的列子,配置如下: //在宝塔下如用/upload这个路径应用无效,一定要C:/wwwroot/upload才有效果 <Directory "要去掉 ...

  9. Windows API 编程入门

    Windows 工作原理的中心思想就是“动态链接”概念.Windows 自身带有一大套函数,应用程序就是通过调用这些函数 来实现它的用户界面和在屏幕上显示文本和图形的.这些函数都是在动态链接库里实现的 ...

随机推荐

  1. git.exe 妙用

    1.如果 window 上的命令行,在进行编译的不好使 可以尝试在git 中运行 2.运行 python 脚本 ,保持脚本一直执行(尤其是中间出错) 可以做一个 sh 文件,然后在git 中运行 #! ...

  2. Codeforces Round #545 (Div. 2) 题解

    题目链接 A. Sushi for Two 题意 在一个 01 序列中找出长为偶数的连续的一段使得它前一半和后一半内部分别相同,而前一半和后一半不同. \(2\le n\le 100\ 000\) 题 ...

  3. 矩阵&&高斯消元

    矩阵运算: \(A\times B\)叫做\(A\)左乘\(B\),或者\(B\)右乘\(A\). 行列式性质: \(1.\)交换矩阵的两行(列),行列式取相反数. \(2.\)某一行元素都\(\ti ...

  4. python自动化day4-函数嵌套、名称空间、作用域、装饰器

    1.函数嵌套 #函数的镶套调用:在调用一个函数的过程中,又调用其他函数 def max2(x,y): if x > y: return x else: return y def max4(a,b ...

  5. 面向对象程序设计(C++)_作业一_设计、定义并实现Complex类

    源代码: 运行结果:

  6. sort sorted() reverse() reversed() 的区别1

    sort()是可变对象(字典.列表)的方法,无参数,无返回值,sort()会改变可变对象,因此无需返回值.sort()方法是可变对象独有的方法或者属性,而作为不可变对象如元组.字符串是不具有这些方法的 ...

  7. new Map的妙用

    const actions = new Map([ [1, ['processing','IndexPage']], [2, ['fail','FailPage']], [3, ['fail','Fa ...

  8. jQuery 学习笔记(TryjQuery)

    第一集.页面加载完成后执行 js 代码: $(document).ready(function(){ $("h1").text("Where to?"); }) ...

  9. vue2.0修饰符sync用法

    如果子组件是一个弹窗,我们想通过点击关闭按钮来关闭子组件弹窗,子组件弹窗的v-show由变量isVisible控制,这个变量通过props由父组件来注入, 而子组件无法改变props里面的变量的值,但 ...

  10. 冀永楠:OCR的应用锦集及背后技术

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云加社区技术沙龙 发表于云+社区专栏 演讲嘉宾:冀永楠,现为腾讯云大数据AI产品中心高级研究员.负责了腾讯云与华星光电等多个图像AI项 ...