2013-08-04 84 views
3

我試着去找到一個窗口上的特定進度(msctls_progress32)的值在一個特定的控制,查找窗口

我已經找到了窗口:

[DllImport("User32.dll")] 
public static extern IntPtr FindWindow(string strClassName, string strWindowName); 

,但我不能讓該進度的指針有:

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string lclassName, string windowTitle); 

然後,一旦我有指針我想與價值:

public const int PBM_GETPOS = 0x0408; 
[DllImport("User32.dll")] 
public static extern Int32 SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 

的問題是,有窗口和進度條我想要的指針上的多個進度條在內部多#32770(對話框)

+1

由於您使用C#,爲什麼不使用UIAutomation命名空間中提供的功能呢?更容易。 –

+0

你能舉個例子嗎? –

+0

我們已經知道這些聲明是什麼樣子。我們不知道的是你的代碼看起來像什麼。一種可能的疏忽是你忘記先找到對話框。 –

回答

1

我回答了這個問題,通過使用UIAutomation混合SendMessageFindWindow

//Get parent window. 
AutomationElement element = AutomationElement.FromHandle(Win32.FindWindow(null, "Form1")); 
//Get all descendants 
AutomationElementCollection elements = element.FindAll(TreeScope.Descendants, Condition.TrueCondition); 
//loop through descendants 
foreach (AutomationElement elementNode in elements) 
{ 
    //if descendant is a progress bar 
    if (elementNode.Current.NativeWindowHandle != 0 && elementNode.Current.LocalizedControlType == "progress bar") 
    { 
     //Show value of the bar. 
     MessageBox.Show(Win32.SendMessage((IntPtr)elementNode.Current.NativeWindowHandle, Win32.PBM_GETPOS, IntPtr.Zero, IntPtr.Zero).ToString(), "Bar value"); 
    } 
}