C# Windows窗體獲取(遍歷)的實現

          windows所有的窗體都是被系統所管理的,系統以句柄的形式去表征這些窗體,我們的目標就是找到這些句柄
          通過msdn可以查詢到要獲取所有的窗體需借助于EnumDesktopWindows這個api函數去實現,函數原型如下

          BOOL WINAPI EnumDesktopWindows(
          __in_opt HDESK hDesktop,
          __in WNDENUMPROC lpfn,
          __in LPARAM lParam
          );

          http://msdn.microsoft.com/en-us/library/windows/desktop/ms682615%28v=vs.85%29.aspx
          我講講這個函數吧
          第一個參數是一個HDESK 類型參數,就是指定桌面的指針,如何獲取桌面指針,不在今天的話題之內,當hDesktop參數為空時,默認表示當前桌面
          第二個參數WNDENUMPROC聲明的函數指針,WNDENUMPROC的聲明如下

          BOOL CALLBACK EnumWindowsProc(
          __in HWND hwnd,
          __in LPARAM lParam
          );
          //這函數就不解釋了窗體句柄加LPARAM參數

          第三個參數是傳遞給回調的lParam值,一般為空就行
          C#中我們這樣聲明
          聲明委托

          public delegate bool EnumDesktopWindowsDelegate(IntPtr hWnd, uint lParam);


          定義API導出函數

          [DllImport("user32.dll", EntryPoint = "EnumDesktopWindows", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
          [return: MarshalAs(UnmanagedType.Bool)]
          public static extern bool EnumDesktopWindows(IntPtr hDesktop, EnumDesktopWindowsDelegate lpEnumCallbackFunction, IntPtr lParam);

          我們像下面這樣使用

          WinAPIHelper.EnumDesktopWindows(IntPtr.Zero,
          new WinAPIHelper.EnumDesktopWindowsDelegate(delegate(IntPtr hWnd, uint lparam)
          {
              if (pids.Contains(WndHelper.GetProcessId(hWnd)))
              {
                  weas.Add(GetWinArgs(hWnd));
              }
              return true;
          }),
          IntPtr.Zero);

          當然你也可以分開寫

          WinAPIHelper.EnumDesktopWindows(IntPtr.Zero, new WinAPIHelper.EnumDesktopWindowsDelegate(EnumWindowsProc), IntPtr.Zero);
          bool EnumWindowsProc(IntPtr hWnd, uint lparam)
          {
              if (pids.Contains(WndHelper.GetProcessId(hWnd)))
              {
                  weas.Add(GetWinArgs(hWnd));
              }
              return true;
          }

          通過這方法我們實現對所有窗體的獲取

          本博客所有文章如無特別注明均為原創

          如果覺得對你有幫助,可以通過下方打賞對作者表示鼓勵

          本文采用知識共享署名-非商業性使用-相同方式共享

          如若轉載,請注明出處:《C# Windows窗體獲取(遍歷)的實現》http://www.solariosolutions.com/77.html

          (2)
          打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
          鋒哥的頭像鋒哥管理員
          上一篇 2013年5月3日 09:47
          下一篇 2013年5月6日 09:21

          相關推薦

          發表回復

          登錄后才能評論
          国产厨房乱子伦露脸,XXXXAAA欧美,日本 888 XXXX,国产欧美日韩一区二区图片