求C# 通过程序名.EXE找到窗口句柄!

zxvyio 2014-10-30 09:27:51
求C# 通过程序名.EXE找到窗口句柄! 因为该程序的标题是动态的,所以不能用FindWindowEx,求实例,最好直接改 比如 AAA.EXE就能直接用!
...全文
1491 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxvyio 2014-10-31
  • 打赏
  • 举报
回复
引用 5 楼 WM_JAWIN 的回复:
Process.MainWindowHandle http://msdn.microsoft.com/zh-cn/library/system.diagnostics.process.mainwindowhandle.aspx 如果你要找的不是主窗,就得再 楼上的说的enumwindows ,再搜索一下
那个AAA.exe是外部的,和C#程序没有关系,只是要通过C#程序 取到AAA.exe的句柄,上面这个如果可以做到的话,请给个 实例吧,C#菜菜,不会用啊!
WM_JAWIN 2014-10-31
  • 打赏
  • 举报
回复
Process.MainWindowHandle http://msdn.microsoft.com/zh-cn/library/system.diagnostics.process.mainwindowhandle.aspx 如果你要找的不是主窗,就得再 楼上的说的enumwindows ,再搜索一下
zxvyio 2014-10-31
  • 打赏
  • 举报
回复
引用 2 楼 zanfeng 的回复:
enumwindows 这个API
这个在网上找过,但是取到的可能是程序里的对话框句柄,不是想要的窗口的句柄!


public static IntPtr GetCurrentWindowHandle()
            {
                IntPtr ptrWnd = IntPtr.Zero;
                uint uiPid = uint.Parse(hqpid("AAA").ToString());//这段代码直接写入PID,回来的也不是想要的句柄//取绝对值,再作类型转换  // 当前进程 ID
                object objWnd = processWnd[uiPid];

                //Trace.WriteLine(processWnd[uiPid]);

                if (objWnd != null)
                {
                    ptrWnd = (IntPtr)objWnd;
                    if (ptrWnd != IntPtr.Zero && IsWindow(ptrWnd))  // 从缓存中获取句柄
                    {
                        
                        return ptrWnd;
                    }
                    else
                    {
                        ptrWnd = IntPtr.Zero;
                    }
                }
                

                bool bResult = EnumWindows(new WNDENUMPROC(EnumWindowsProc), uiPid);
                // 枚举窗口返回 false 并且没有错误号时表明获取成功
                if (!bResult && Marshal.GetLastWin32Error() == 0)
                {
                    objWnd = processWnd[uiPid];
                    
                    if (objWnd != null)
                    {
                        ptrWnd = (IntPtr)objWnd;
                    }
                }

                return ptrWnd;
            }

            private static bool EnumWindowsProc(IntPtr hwnd, uint lParam)
            {
                uint uiPid = 0;

                if (GetParent(hwnd) == IntPtr.Zero)
                {
                    GetWindowThreadProcessId(hwnd, ref uiPid);
                    if (uiPid == lParam)    // 找到进程对应的主窗口句柄
                    {
                        processWnd[uiPid] = hwnd;   // 把句柄缓存起来
                        SetLastError(0);    // 设置无错误
                        return false;   // 返回 false 以终止枚举窗口
                    }
                }

                return true;
            }

zxvyio 2014-10-31
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
通过进程名获得句柄 GetModuleHandle CreateToolHelp32Snapshot取进程
能给个实例吗?C#菜菜,不会用!
zxvyio 2014-10-31
  • 打赏
  • 举报
回复
引用 8 楼 WM_JAWIN 的回复:
Process.GetProcessesByName("aaa")[0].MainWindowHandle ;
强,这个功能小菜我搞了快一星期了,你一个语句搞定了,赞!!
WM_JAWIN 2014-10-31
  • 打赏
  • 举报
回复
Process.GetProcessesByName("aaa")[0].MainWindowHandle ;
足球中国 2014-10-30
  • 打赏
  • 举报
回复
enumwindows 这个API
bdmh 2014-10-30
  • 打赏
  • 举报
回复
通过进程名获得句柄 GetModuleHandle CreateToolHelp32Snapshot取进程

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧