首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测OpenFileDialog

检测OpenFileDialog
EN

Stack Overflow用户
提问于 2017-07-04 13:58:48
回答 1查看 1.3K关注 0票数 1

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

我怎么会这么做?

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

到目前为止,我无法通过hwnd检测窗口是否为OpenFileDialog。

我为什么要这样做?

我是一个高水平的程序员,一开始尝试使用windows钩子,但没有成功。我试着用easy钩子和deviare2。似乎没有更简单的方法在COM (IFileDialog)组件调用中放置全局挂钩。

是否有任何方法通过hwnd检测窗口是否是默认的Windows OpenFileDialog窗口?

代码语言:javascript
复制
public bool IsOpenFileDialog(IntPtr hwnd)
{
    return ?
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-04 16:03:25

作为部分解决方案(对手可以模仿这样的对话框),我建议检查窗口是否是标准对话框,如果是的话,它在标题中是否有"Save“(您很可能在这里放置一个更好的ctriterium ):

首先,让我们检查一下class

https://msdn.microsoft.com/en-us/library/windows/desktop/ms633574(v=vs.85).aspx

代码语言:javascript
复制
 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都通过它。让我们检查一下窗口的标题:

代码语言:javascript
复制
  [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;
   } 

最后:

代码语言:javascript
复制
  public bool IsOpenFileDialog(IntPtr hwnd) {
    return IsDialogClassName(hwnd) && 
           !IsSaveCaption(hwnd);
  }

当然,你可能需要一些其他的标准,但我希望这两个标准就足够了。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44907938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档