Csharp/C#教程:C#获取进程的主窗口句柄的实现方法分享

通过调用Win32API实现。
代码如下:
publicclassUser32API
{
   privatestaticHashtableprocessWnd=null;

   publicdelegateboolWNDENUMPROC(IntPtrhwnd,uintlParam);

   staticUser32API()
   {
       if(processWnd==null)
       {
           processWnd=newHashtable();
       }
   }

   [DllImport(“user32.dll”,EntryPoint=”EnumWindows”,SetLastError=true)]
   publicstaticexternboolEnumWindows(WNDENUMPROClpEnumFunc,uintlParam);

   [DllImport(“user32.dll”,EntryPoint=”GetParent”,SetLastError=true)]
   publicstaticexternIntPtrGetParent(IntPtrhWnd);

   [DllImport(“user32.dll”,EntryPoint=”GetWindowThreadProcessId”)]
   publicstaticexternuintGetWindowThreadProcessId(IntPtrhWnd,refuintlpdwProcessId);

   [DllImport(“user32.dll”,EntryPoint=”IsWindow”)]
   publicstaticexternboolIsWindow(IntPtrhWnd);

   [DllImport(“kernel32.dll”,EntryPoint=”SetLastError”)]
   publicstaticexternvoidSetLastError(uintdwErrCode);

   publicstaticIntPtrGetCurrentWindowHandle()
   {
       IntPtrptrWnd=IntPtr.Zero;
       uintuiPid=(uint)Process.GetCurrentProcess().Id; //当前进程ID
       objectobjWnd=processWnd[uiPid];

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

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

       returnptrWnd;
   }

   privatestaticboolEnumWindowsProc(IntPtrhwnd,uintlParam)
   {
       uintuiPid=0;

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

       returntrue;
   }
}

调用User32API.GetCurrentWindowHandle()即可返回当前进程的主窗口句柄,如果获取失败则返回IntPtr.Zero。

–EOF–

您可能感兴趣的文章:win7中C#的winForm编程使用savefiledialog不能弹出保存窗体的解决方法C#设置MDI子窗体只能弹出一个的方法C#实现在前端网页弹出警告对话框(alert)的方法C#实现客户端弹出消息框封装类实例C#调用API函数弹出映射网络驱动器对话框问题div弹出层的ajax登录(Jquery版+c#)C#WinForm窗口最小化到系统托盘C#Winform中实现主窗口打开登录窗口关闭的方法c#winform窗口一直置顶显示在桌面最上方或最底层的方法C#Winform让整个窗口都可以拖动C#winform实现右下角弹出窗口结果的方法

标签: 句柄 方法 进程

C++实现顺序排序算法简单示例代码

VC++实现选择排序算法简单示例

上述就是C#学习教程:C#获取进程的主窗口句柄的实现方法分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/904632.html

(0)
上一篇 2021年10月22日
下一篇 2021年10月22日

精彩推荐