2012-12-20 15 views
1

我想寫一個函數,它遍歷頂級窗口,並將它們放入列表中,如果他們滿足一組條件。目前我可以通過將窗口添加到靜態List<IntPtr> instances變量中來實現此目的,但我想將指針傳遞給EnumWindowsProclParam中的列表以避免此靜態變量。通過列表<IntPtr> *到EnumWindows的lParam在C#

我想我必須使用fixed來修復列表在內存中的位置,但我不確定如何做到這一點。我想這到列表傳遞給我的回調函數:

unsafe 
{ 
    fixed (void* dp = &instances) 
    { 
     WinApi.EnumWindows(new WinApi.EnumWindowsProc(FindPPWindows), dp); 
    } 
} 

,但我得到

Cannot take the address of, get the size of, or declare a pointer to a managed type ('System.Collections.GenericList<IntPtr>') 

我新望到C#,所以我真的不知道如何做到這一點 - 或者即使有可能,我讀過編組包含引用的託管類型是不可能的,但我只需要將它修復到內存中並創建一個指向它的指針,然後將指針轉回並使用它。我如何完成這項工作?

+0

不能創建一個指向類。你唯一能做的就是創建一個數組,並傳遞第一個項目的指針,'void * dp =&instancesArray'將指向第一個項目。但是你仍然需要保持數組的大小,併發送足夠大的數組來包含所有的窗口。 – RoadBump

回答

2

您可以使用lambda表達式調用EnumWindows函數。然後EnumWindowsProc回調將是在線,您可以訪問本地變量:

List<IntPtr> list = new List<IntPtr>();    

WinApi.EnumWindows((hWnd, lParam) => 
{ 
     //check conditions 
     list.Add(hWnd); 

     return true; 

}, IntPtr.Zero); 

你可以封裝在一個額外的功能,這種內嵌調用,例如:

List<IntPtr> GetMatchingHWnds() 
{ 
    List<IntPtr> list = new List<IntPtr>();    

    WinApi.EnumWindows((hWnd, lParam) => 
    { 
      //check conditions 
      list.Add(hWnd); 

      return true; 

    }, IntPtr.Zero); 

    return list;   
}