最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#獲取進程的主窗口句柄的實現(xiàn)方法

 更新時間:2013年04月28日 15:39:40   作者:  
C#獲取進程的主窗口句柄的實現(xiàn)方法,需要的朋友可以參考一下

通過調用Win32 API實現(xiàn)。

復制代碼 代碼如下:

public class User32API
{
    private static Hashtable processWnd = null;

    public delegate bool WNDENUMPROC(IntPtr hwnd, uint lParam);

    static User32API()
    {
        if (processWnd == null)
        {
            processWnd = new Hashtable();
        }
    }

    [DllImport("user32.dll", EntryPoint = "EnumWindows", SetLastError = true)]
    public static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, uint lParam);

    [DllImport("user32.dll", EntryPoint = "GetParent", SetLastError = true)]
    public static extern IntPtr GetParent(IntPtr hWnd);

    [DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId")]
    public static extern uint GetWindowThreadProcessId(IntPtr hWnd, ref uint lpdwProcessId);

    [DllImport("user32.dll", EntryPoint = "IsWindow")]
    public static extern bool IsWindow(IntPtr hWnd);

    [DllImport("kernel32.dll", EntryPoint = "SetLastError")]
    public static extern void SetLastError(uint dwErrCode);

    public static IntPtr GetCurrentWindowHandle()
    {
        IntPtr ptrWnd = IntPtr.Zero;
        uint uiPid = (uint)Process.GetCurrentProcess().Id;  // 當前進程 ID
        object objWnd = 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;
    }
}

調用User32API.GetCurrentWindowHandle()即可返回當前進程的主窗口句柄,如果獲取失敗則返回IntPtr.Zero。

--EOF--

相關文章

  • C# 讀寫XML文件實例代碼

    C# 讀寫XML文件實例代碼

    在本篇文章里小編給大家整理的是關于C# 讀寫XML文件最簡單方法,需要的朋友們可以跟著學習參考下。
    2020-03-03
  • C#如何優(yōu)雅的對WinForm窗體應用程序進行權限控制

    C#如何優(yōu)雅的對WinForm窗體應用程序進行權限控制

    經常會出現(xiàn)winfrom頁面需要加載權限樹,下面這篇文章主要給大家介紹了關于C#如何優(yōu)雅的對WinForm窗體應用程序進行權限控制的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • Unity UGUI的GridLayoutGroup網格布局組件使用詳解

    Unity UGUI的GridLayoutGroup網格布局組件使用詳解

    這篇文章主要介紹了Unity UGUI的GridLayoutGroup網格布局組件使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 解析C#中斷言與異常的應用方式及異常處理的流程控制

    解析C#中斷言與異常的應用方式及異常處理的流程控制

    這篇文章主要介紹了C#中斷言與異常的應用方式及異常處理的流程控制,一般來說斷言用于修正程序員自己的錯誤而異常用于應對程序運行過程中可能出現(xiàn)的錯誤,需要的朋友可以參考下
    2016-01-01
  • C#中sealed修飾符的具體使用

    C#中sealed修飾符的具體使用

    在 C# 中,sealed?是一個修飾符,用于限制繼承和重寫,本文就來介紹一下具體使用,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • 詳解C#中的out和ref

    詳解C#中的out和ref

    本文主要介紹了out和ref的相關知識。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • C#中事件的繼承實例分析

    C#中事件的繼承實例分析

    這篇文章主要介紹了C#中事件的繼承,通過一個面向對象程序實例來說明子類調用父類事件的實現(xiàn)方法,需要的朋友可以參考下
    2014-08-08
  • C#中簡單的拆箱操作用法實例分析

    C#中簡單的拆箱操作用法實例分析

    這篇文章主要介紹了C#中簡單的拆箱操作用法.實例分析了C#中拆箱的概念與相關的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • C#數組學習相關資料整理

    C#數組學習相關資料整理

    最近開始學習c#,并有幸接觸到了數組方便的操作,感覺確實不錯,這里簡單的整理下c#相關的學習資料,方便大家學習
    2012-09-09
  • C#加解密之DES算法的實現(xiàn)

    C#加解密之DES算法的實現(xiàn)

    DES算法為密碼體制中的對稱密碼體制,又被稱為美國數據加密標準。本文將用C#語言實現(xiàn)DES算法,文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-08-08

最新評論

三亚市| 蒙山县| 扶沟县| 神池县| 汝南县| 洛浦县| 阿勒泰市| 长治县| 白城市| 舒兰市| 广东省| 乐昌市| 绩溪县| 富锦市| 南宫市| 榆林市| 嘉鱼县| 营口市| 永登县| 临邑县| 宜兰市| 当雄县| 仪征市| 永昌县| 新建县| 延长县| 邵武市| 邢台县| 湾仔区| 梁平县| 沁阳市| 天峻县| 依安县| 延川县| 朔州市| 宜宾县| 军事| 安义县| 丁青县| 崇礼县| 黑山县|