首页 新闻 会员 周边 捐助

如何判断一个窗口句柄的存在?

0
悬赏园豆:50 [待解决问题]

现有一个程序,里面会随机出现一些窗口(或者是绘画成的界面,可看做为找图问题),如何判断出出现的窗口界面是我想要的?比如说窗口标题是“文件”,我怎么能确定弹出窗口就是我要的呢?百度很久了,没有相关的说明,看到一点点关于窗口句柄的问题,但是不能够解决这个问题。还请大侠们多多帮忙啊

青衫难改的主页 青衫难改 | 初学一级 | 园豆:154
提问于:2011-09-30 00:33
< >
分享
所有回答(4)
0

查找一下相关的Windows API,可以通过标题查找窗口。

I,Robot | 园豆:9783 (大侠五级) | 2011-09-30 04:02
0

windows api


        /// <summary>
        /// 获取系统窗体句柄
        /// </summary>
        /// <param name="lpClassName"></param>
        /// <param name="lpWindowName"></param>
        /// <returns></returns>
        [DllImport("User32.dll", EntryPoint = "FindWindow")]
        public static extern IntPtr FindWindow(string lpClassName, string
        lpWindowName);

通过该方法可以获取当前打开窗口的句柄.通过句柄创建你所要的窗体类型对象..判断标题是不是“文件”。

注意:这个api用的时候的class名称你需要用句柄查看器来看..不是 class demo的名称就是“demo” 可能是“1233-demo ”

邢少 | 园豆:10926 (专家六级) | 2011-09-30 09:06
0

同上,window api可以做到

lawbc | 园豆:63 (初学一级) | 2011-09-30 09:13
0

public delegate bool EnumWindowsProc(IntPtr p_Handle, int p_Param);
  [DllImport("user32.dll")]
  public static extern int EnumWindows(EnumWindowsProc ewp, int lParam);
  [DllImport("User32.dll", CharSet = CharSet.Auto)]
  public static extern int GetWindowText(IntPtr hWnd, out STRINGBUFFER text, int nMaxCount);   
  [DllImport("user32.dll")]
  public static extern bool IsWindowVisible(IntPtr hWnd);
  [DllImport("user32.dll")]
  public static extern IntPtr GetWindowThreadProcessId(IntPtr hwnd, ref int lpdwProcessId);
  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
  public struct STRINGBUFFER
  {
  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
  public string szText;
  }

  private void button1_Click(object sender, EventArgs e)
  {
  MessageWindwos();
  }

  public void MessageWindwos()
  {   

  EnumWindowsProc _EunmWindows = new EnumWindowsProc(NetEnumWindows);
  EnumWindows(_EunmWindows, 0);   
  }
    
  private bool NetEnumWindows(IntPtr p_Handle, int p_Param)
  {
  if (!IsWindowVisible(p_Handle))return true;

  STRINGBUFFER _TitleString = new STRINGBUFFER();
  GetWindowText(p_Handle, out _TitleString, 256);

  MessageBox.Show(_TitleString.szText); ///获取的窗体
    
  return true;
  }


获取说有窗体 ...获取控件和这个差不过 使用

  public delegate bool EnumWindowsProc(IntPtr p_Handle, int p_Param);
  [DllImport("user32.dll")]
  public static extern int EnumChildWindows(IntPtr hWndParent, EnumWindowsProc ewp, int lParam);
  /// <summary>
  /// 获取所有控件的信息
  /// </summary>
  /// <param name="p_Handle">窗体句饼</param>
  /// <returns></returns>
  public LoadControl(IntPtr p_Handle)
  {   
  EnumWindowsProc _EunmControl = new EnumWindowsProc(NetEnumControl);

  Win32API.EnumChildWindows(p_Handle, _EunmControl, 0);
  return _ControlList;
  }
  private bool NetEnumControl(IntPtr p_Handle, int p_Param)
  {
  STRINGBUFFER _TextString = new STRINGBUFFER();
  GetWindowText(p_Handle, out _TextString, 256);

    
  MessageBox.Show(_TextString.szText);

  return true;
  }

waninlezu | 园豆:661 (小虾三级) | 2011-10-02 00:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册