您的位置:首页 > 其它

利用简单Win32窗口函数捕获用户修改文件夹权限的动作

2008-07-02 20:43 351 查看
今天早上去公司上班,老板去的很早,在我吃带过去的饼的时候,老板和我聊了一下下一步该怎么做。我原以为老板会让我把昨天写的代码集成到现有的系统里去的。哪知道老板说,现在的系统已经很稳定了,希望我能把我写的代码作为一个独立的进程来运行,以免影响到原有的系统的稳定。这下可难着我了,我怎么知道用户什么时候修改了文件夹的权限呢?本来我的如意算盘是:当用户把文件上传到服务器前,我检测一下文件夹的权限,然后做相应的修改。这个时机是可以把握住的。现在却要让我捕获用户修改权限的动作。幸好以前看的书多,多少知道些概念,似乎可以用HOOK来实现。单独的进程也可以作为服务隐藏进Services.exe中。看看老板期待的眼神,我只好说,让我尽力试试吧。

于是开始查资料了。首先看的还是Jeffrey Richter先生的书:Programming Applications for Microsoft Windows, Fourth Edition,准备研究一下怎么写一个HOOK DLL。但是后来因为没有例子程序,再加上这个我想肯定要花很长的时间来研究。时间长了,老板肯定不会很高兴的。还是找个简单的方法吧。不知怎的,突然想起FindWindow函数了,后来查查资料,换成了GetForegroundWindow。我想用户修改文件夹的权限肯定是通过文件夹的属性的安全选项卡来进行的。这样只要用户打开了安全编辑框,就假设用户想修改权限了,接着就获得文件夹的路径,检测权限有没有被修改。嗯,似乎也可以成为一个解决方案。

刚开始,进展都很顺利,顺利得到文件夹名。但是文件夹的路径却难到我了。这个文件夹的名字是通过对话框的标题中得到的。路径一下在找不到可以从哪里得到。查找MSDN,也没有找到有这样的函数。再仔细看看文件夹的属性对话框,发现“常规”选项卡里有这个信息。哈哈。信息是有了,但是怎么才能得到呢?首先想到的当然是微软有没有提供通过文件夹名字来返回文件夹属性对话框中显示的信息的函数呢?查找了一下,很失望的发现:答案是NO。想了想,也只能通过窗口之间的关系来得到了。这次还第一次用到了EnumChildWindows函数。可气的是,一开始,通过调用GetWindowText只能得到“常规”选项卡左边的信息,右边返回的都是空。恰好老板过来问我做的怎么样了,我告诉他现在的情况。他建议我用搜索,但是现在的硬盘都很大,文件夹的数量上万是正常的,这样会不会速度太慢呢。还是先好好研究一下吧。后来仔细用鼠标点了点文件夹的属性对话框的“常规”选项卡,发现光标并不一样。左边的不可以选中,右边的是可以的。看来窗口类不一样了。后来摸索了好久,终于通过SendMessage(hwnd, WM_GETTEXT, 256, (LPARAM)szBufText);完成了任务。:)

下面是我的代码。基本属于原创。嗯,不错!^_^

#include "stdafx.h"
#include <Windows.h>
#include <tchar.h>
#include <atlstr.h>
#include <string>
using namespace std;

BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam);

TCHAR szBufText[1024];

int _tmain(int argc, _TCHAR* argv[])
{
HWND hActiveWnd;
CString szPath, szFoldName, szLocation;
while (1) {
if ((hActiveWnd = GetForegroundWindow())) {
int len = GetWindowTextLength(hActiveWnd);
GetWindowText(hActiveWnd, szBufText, len + 1);
CString str(szBufText);
int idx;
if ((idx = str.Find(_T("高级安全设置"), 0)) != -1) {
idx -= 2;
// 获得文件夹的名字。
szBufText[idx] = '/0';
szFoldName = szBufText;
// 从文件夹属性对话框中获得文件夹路径。
HWND hWnd = GetParent(hActiveWnd);
hWnd = FindWindowEx(GetParent(hActiveWnd), NULL, NULL, _T("常规"));
if (hWnd) {
while (1) {
if (!EnumChildWindows(hWnd, EnumChildProc, NULL)) {
szLocation = szBufText;
if (szLocation[szLocation.GetLength() - 1] == '/')
szPath = szLocation + szFoldName;
else
szPath = szLocation + "/" + szFoldName;
_tprintf(szBufText);
_tprintf(_T(" "));
MessageBox(NULL, szPath, _T("文件夹路径:"), MB_ICONQUESTION);
memset(szBufText, 0, sizeof(TCHAR) * 1024);
break;
}
}
}
}

Sleep(1000);
}
}
return 0;
}

BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{
SendMessage(hwnd, WM_GETTEXT, 256, (LPARAM)szBufText);
CString str(szBufText);
CString strPat(_T(":/"));
if (str.Find(strPat, 0) != -1)
return FALSE; // stop.

return TRUE; // continue.
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐