对于DLP软件的一个非常特殊的要求,我试图在捕获所选文件后检测OpenFileDialogs并取消文件选择操作。

我该怎么做呢?

我在鼠标和键盘上挂了一个全局钩子。我检测到用户可以执行的所有操作,以在OpenFileDialog窗口中选择文件。

直到现在我还是不能通过hwnd检测该窗口是否为OpenFileDialog。

我为什么要这样尝试?

我是高级程序员,最初尝试使用Windows挂钩,但没有成功。我尝试了easyhook和deviare2。在COM(IFileDialog)组件调用中似乎没有更简单的方法来放置全局钩子。

是否可以通过hwnd检测窗口是否为默认的Windows OpenFileDialog窗口?

public bool IsOpenFileDialog(IntPtr hwnd)
{
    return ?
}

最佳答案

作为部分解决方案(对手可以模仿这种对话框),我建议检查窗口是否为标准对话框,如果是,则在标题中是否包含“保存”(您可以在此处放置一个更好的标准):

首先,让我们检查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 DialogOpen 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);
  }


当然,您可能还需要其他条件,但我希望这两个条件就足够了

关于c# - 检测OpenFileDialog,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44907938/

10-13 03:23