免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3270 | 回复: 10
打印 上一主题 下一主题

[C++] vc 如何过滤 notepad的“保存 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-21 22:36 |只看该作者 |倒序浏览
       小弟最近碰上一个难题,在固定目录下(c:\\tmp) 要求打开里面的notepad,word,等文件,打开该目录文件时。要求屏蔽记事本的保存,和另存为按钮(还有快捷键)。vc不知道上层能实现该功能不,还是需要驱动来过滤。求给建议。。。。

论坛徽章:
0
2 [报告]
发表于 2014-08-22 08:37 |只看该作者
VC的Shell相关api应该可以做,你这个功能可能会涉及IContextMenu等接口。可以去codeproject上找找例子。
这种功能还不需要过滤驱动。

论坛徽章:
0
3 [报告]
发表于 2014-08-22 08:39 |只看该作者
官方这里有文档:

http://msdn.microsoft.com/en-us/library/windows/desktop/bb773177(v=vs.85).aspx
主要看 Windows Shell部分。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
4 [报告]
发表于 2014-08-22 09:13 |只看该作者
没办法啊~~~

论坛徽章:
0
5 [报告]
发表于 2014-08-22 09:15 |只看该作者
最好的方法是写文件系统过滤驱动,禁止某些进程对特定路径下的写入操作

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
6 [报告]
发表于 2014-08-22 10:49 |只看该作者
把文件改为只读属性。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
7 [报告]
发表于 2014-08-22 11:16 |只看该作者

  1. /* domenu.c */

  2. #include <windows.h>
  3. #include <stdio.h>

  4. struct enum_window_param
  5. {
  6.         DWORD thread_id;
  7.         HWND h_wnd;
  8. };

  9. BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
  10. {
  11.         struct enum_window_param *param;

  12.         param = (struct enum_window_param *)lParam;
  13.         param->h_wnd = hwnd;
  14.         return FALSE;
  15. }

  16. int get_thread_window(DWORD thread_id, HWND *o_wnd)
  17. {
  18.         struct enum_window_param param;

  19.         param.thread_id = thread_id;
  20.         param.h_wnd = NULL;
  21.         EnumThreadWindows(thread_id, EnumWindowsProc, (LPARAM)&param);
  22.         if (param.h_wnd != NULL) {
  23.                 *o_wnd = param.h_wnd;
  24.                 return 0;
  25.         }
  26.         return -1;
  27. }

  28. int load_app(char *cmd, HANDLE *o_process, HANDLE *o_thread, HWND *o_wnd)
  29. {
  30.         STARTUPINFO startup_info;
  31.         PROCESS_INFORMATION process_info;
  32.         HWND hwnd;

  33.         ZeroMemory(&startup_info, sizeof(startup_info));
  34.         startup_info.cb = sizeof(startup_info);
  35.         startup_info.dwFlags = STARTF_USESHOWWINDOW;
  36.         startup_info.wShowWindow = SW_SHOW;
  37.         if (CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &startup_info, &process_info)) {
  38.                 if (o_process != NULL) {
  39.                         *o_process = process_info.hProcess;
  40.                 }else {
  41.                         CloseHandle(process_info.hProcess);
  42.                 }
  43.                 if (o_thread != NULL) {
  44.                         *o_thread = process_info.hThread;
  45.                 }else {
  46.                         CloseHandle(process_info.hThread);
  47.                 }
  48.                 if (o_wnd != NULL) {
  49.                         WaitForInputIdle(process_info.hProcess, INFINITE);
  50.                         while (get_thread_window(process_info.dwThreadId, &hwnd) != 0) {
  51.                         }
  52.                         *o_wnd = hwnd;
  53.                 }
  54.                 return 0;
  55.         }
  56.         return -1;
  57. }

  58. int main(void)
  59. {
  60.         HANDLE process;
  61.         HWND wnd;
  62.         HMENU menu;
  63.         MENUITEMINFO menu_info;

  64.         if (load_app("notepad domenu.c", &process, NULL, &wnd) == 0) {
  65.                 menu = GetMenu(wnd);
  66.                 menu = GetSubMenu(menu, 0);
  67.                 ZeroMemory(&menu_info, sizeof(menu_info));
  68.                 menu_info.cbSize = sizeof(menu_info);
  69.                 menu_info.fMask = MIIM_STATE;
  70.                 GetMenuItemInfo(menu, 2, TRUE, &menu_info);
  71.                 menu_info.fState |= MFS_DISABLED;
  72.                 SetMenuItemInfo(menu, 2, TRUE, &menu_info);
  73.                 ZeroMemory(&menu_info, sizeof(menu_info));
  74.                 menu_info.cbSize = sizeof(menu_info);
  75.                 menu_info.fMask = MIIM_STATE;
  76.                 GetMenuItemInfo(menu, 3, TRUE, &menu_info);
  77.                 menu_info.fState |= MFS_DISABLED;
  78.                 SetMenuItemInfo(menu, 3, TRUE, &menu_info);
  79.                 WaitForSingleObject(process, INFINITE);
  80.                 CloseHandle(process);
  81.                 return 0;
  82.         }
  83.         return -1;
  84. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2014-08-22 16:18 |只看该作者
谢谢,给位。正在调试中

论坛徽章:
0
9 [报告]
发表于 2014-08-24 20:30 |只看该作者
谢谢cobras。 但是保存按钮怎么灰掉。可以说说思路不。嘿嘿。(是想把关闭按钮给disabled掉)

回复 7# cobras


   

论坛徽章:
6
技术图书徽章
日期:2013-11-13 11:11:27子鼠
日期:2014-02-20 17:54:13处女座
日期:2014-06-16 17:43:33午马
日期:2014-08-08 09:11:17未羊
日期:2014-08-10 11:57:072015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2014-08-25 09:20 |只看该作者
自己写一个Notepad,没有保存功能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP