对于DLP软件的一个非常特殊的需求,在捕获所选的文件之后,我尝试检测OpenFileDialogs并取消文件选择操作。
我怎么会这么做?
我在鼠标和键盘上放了一个全局钩子。我检测到用户可以执行的在OpenFileDialog窗口中选择文件的所有操作。
到目前为止,我无法通过hwnd检测窗口是否为OpenFileDialog。
我为什么要这样做?
我是一个高水平的程序员,一开始尝试使用windows钩子,但没有成功。我试着用easy钩子和deviare2。似乎没有更简单的方法在COM (IFileDialog)组件调用中放置全局挂钩。
是否有任何方法通过hwnd检测窗口是否是默认的Windows OpenFileDialog窗口?
public bool IsOpenFileDialog(IntPtr hwnd)
{
return ?
}发布于 2017-07-04 16:03:25
作为部分解决方案(对手可以模仿这样的对话框),我建议检查窗口是否是标准对话框,如果是的话,它在标题中是否有"Save“(您很可能在这里放置一个更好的ctriterium ):
首先,让我们检查一下class
https://msdn.microsoft.com/en-us/library/windows/desktop/ms633574(v=vs.85).aspx
using System.Runtime.InteropServices;
...
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern int GetClassName(IntPtr hWnd,
StringBuilder lpClassName,
int nMaxCount);
private static String WndClassName(IntPtr handle) {
int length = 1024;
StringBuilder sb = new StringBuilder(length);
GetClassName(handle, sb, length);
return sb.ToString();
}
public static bool IsDialogClassName(IntPtr handle) {
// Standard windows dialogs like OpenFileDialog, SaveFileDialog have #32770 class name
return "#32770".Equals(WndClassName(handle));
} 然而,这是太广泛的标准:Save File Dialog和Open File Dialog都通过它。让我们检查一下窗口的标题:
[DllImport("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
private static extern int GetWindowTextLength(IntPtr hWnd);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int GetWindowText(IntPtr hWnd,
StringBuilder text,
int length);
private static String WindowText(IntPtr handle) {
int length = GetWindowTextLength(handle);
StringBuilder sb = new StringBuilder(length + 1);
GetWindowText(handle, sb, length + 1);
return sb.ToString();
}
public static bool IsSaveCaption(IntPtr handle) {
//TODO: put a better check for dialog's caption here
return WindowText(handle).IndexOf("Save", StringComparison.OrdinalIgnoreCase) >= 0;
} 最后:
public bool IsOpenFileDialog(IntPtr hwnd) {
return IsDialogClassName(hwnd) &&
!IsSaveCaption(hwnd);
}当然,你可能需要一些其他的标准,但我希望这两个标准就足够了。
https://stackoverflow.com/questions/44907938
复制相似问题