Dzięki za porady
**sharper_99 **- boty, macra, skrypty odpadają, muszę mieć to zaimplementowane w projekcie c#
**Dyzma **- dzięki za wskazówkę, tak już szukałem.
Może pokaże do czego udało mi się dotrzeć:
definicja zmiennych i podstawowych funkcji z których korzystam dalej:
private int hwnd = 0;
private IntPtr hwndChildOK = IntPtr.Zero;
private IntPtr hwndChildCancel = IntPtr.Zero;
private IntPtr hwndChildCombo = IntPtr.Zero;
private const int WM_CLOSE = 16;
private const int BN_CLICKED = 245;
[DllImport("User32.dll")]
public static extern Int32 FindWindow(String lpClassName, String lpWindowName);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int SendMessage(int hWnd, int msg, int wParam, IntPtr lParam);
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
internal static extern int GetWindowTextLength(IntPtr hWnd);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
public static string GetText(IntPtr hWnd)
{
int length = GetWindowTextLength(hWnd);
StringBuilder sb = new StringBuilder(length + 1);
GetWindowText(hWnd, sb, sb.Capacity);
return sb.ToString();
}
public class WindowHandleInfo
{
private delegate bool EnumWindowProc(IntPtr hwnd, IntPtr lParam);
[DllImport("user32")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr lParam);
private IntPtr _MainHandle;
public WindowHandleInfo(IntPtr handle)
{
this._MainHandle = handle;
}
public List<IntPtr> GetAllChildHandles()
{
List<IntPtr> childHandles = new List<IntPtr>();
GCHandle gcChildhandlesList = GCHandle.Alloc(childHandles);
IntPtr pointerChildHandlesList = GCHandle.ToIntPtr(gcChildhandlesList);
try
{
EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
EnumChildWindows(this._MainHandle, childProc, pointerChildHandlesList);
}
finally
{
gcChildhandlesList.Free();
}
return childHandles;
}
private bool EnumWindow(IntPtr hWnd, IntPtr lParam)
{
GCHandle gcChildhandlesList = GCHandle.FromIntPtr(lParam);
if (gcChildhandlesList == null || gcChildhandlesList.Target == null)
{
return false;
}
List<IntPtr> childHandles = gcChildhandlesList.Target as List<IntPtr>;
childHandles.Add(hWnd);
return true;
}
}
znaleźć uchwyt okienka oraz guziki OK i Cancel to nie problem robię to tak:
hwnd = FindWindow(null, "Camera Selection");
hwndChildOK = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, "Button", "OK");
hwndChildCancel = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, "Button", "Cancel");
klikać po guzikach... też nie problem:
SendMessage((int)hwndChildOK, BN_CLICKED, 0, IntPtr.Zero); //kliknij OK
SendMessage((int)hwndChildCancel, BN_CLICKED, 0, IntPtr.Zero); //kliknij Cancel
Problem to odnaleźć ComboBox i coś z nim zrobić...
mając handle okienka próbowałem wy-listować wszystkie uchwyty kontrolerek-dzieci:
var allChildWindows = new WindowHandleInfo((IntPtr)hwnd).GetAllChildHandles();
foreach (int i in allChildWindows)
{
textBox1.Text += "hwnd: [" + i + "] " + GetText((IntPtr)i) + Environment.NewLine;
}
czego wynikiem jest:
hwnd: [5442228] OK
hwnd: [1706796] Cancel
hwnd: [985776] Please select the camera to connect to from the list below:
hwnd: [1772120]
i tutaj właśnie utknąłem
czy ten *1772120 * z którego nie da się wyciągnąć opisu to ComboBox jeśli tak to jak wyciągnąć z niego opcje które są wyświetlane na rozwijanej liście (ta kontrola nie ma żadnych "dzieci" pod sobą), jak zaznaczyć wybraną opcję...
Udało mi się dotrzeć jeszcze do GetComboBoxInfo ale opisy są bardzo skąpe i nie wiem jak to zastosować