Sorry - hier ein paar Hilfen
Oh richtig.
Sorry
public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter);
[DllImport("user32.dll")]
static extern bool EnumThreadWindows(int threadId, EnumWindowProc callback, IntPtr i);
[DllImport("user32.dll")]
static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i);
[DllImport("user32.dll")]
public static extern int GetWindowText(int hWnd, StringBuilder lpString, int nMaxCount);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int SendMessage(IntPtr hwnd, int wMsg, StringBuilder wParam,
int lParam);
[DllImport("user32")]
private static extern int GetDlgCtrlID(IntPtr hwnd);
[DllImport("user32.dll")]
static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
[DllImport("user32")]
private static extern bool GetComboBoxInfo(IntPtr hwndCombo, ref ComboBoxInfo info);
//Fenstertitel
int chars = 100;
StringBuilder buf = new StringBuilder(chars);
GetWindowText(hWnd, buf, chars)
//alle Windows holen
public static List<IntPtr> GetThreadWindows()
{
List<IntPtr> result = new List<IntPtr>();
GCHandle listHandle = GCHandle.Alloc(result);
EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
EnumThreadWindows(GetCurrentThreadId(), childProc, GCHandle.ToIntPtr(listHandle));
listHandle.Free();
return result;
}
..
List<IntPtr> twins = GetThreadWindows();
//findet alle Steuerelemente die dem Fenster zugeordnet sind
public static List<IntPtr> GetChildWindows(IntPtr parent)
{
List<IntPtr> result = new List<IntPtr>();
GCHandle listHandle = GCHandle.Alloc(result);
EnumWindowProc childProc = new EnumWindowProc(EnumWindow);EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
listHandle.Free();
return result;
}
..
List<IntPtr> allPointers = GetChildWindows((IntPtr)hWnd);
//Einfach immer das Handle einsetzen das du aus GetChildWindows bekommen hast.
//Die Liste kannst du einfach mit
foreach (IntPtr ptr in allPointers)
{ .. durchgehen
//und hier als wMsg bei SendMessage kannst du folgendes setzen..
//siehe Seite
//http://www.mycsharp.de/wbb2/print.php?threadid=34505&page=1&sid=b288850697e137cb9264edd104f2093c
//Du kannst Click Events an Buttons schicken usw.
//oder mit 0x014E als wMsg ein Item in einer Listbox setzen
//damit bekommst du die ID
int id = GetDlgCtrlID(wHnd);
//Hiermit bekommst du die Steuerlement Klasse.
StringBuilder sb = new StringBuilder(256);
GetClassName((IntPtr)hWnd, sb, sb.Capacity);
//Falls du das ComboBox Info sendest brauchstdu das hier zum auffangen.
[StructLayout(LayoutKind.Sequential)]
private struct ComboBoxInfo
{
public int cbSize;
public RECT rcItem;
public RECT rcButton;
public IntPtr stateButton;
public IntPtr hwndCombo;
public IntPtr hwndEdit;
public IntPtr hwndList;
}
//Aufruf
//erst GetClassname..
//du bekommst einen Stringbuilder zurück der den Namen der Klasse entählt
//if (sb.ToString().StartsWith("ComboBox"))
{
{
ComboBoxInfo info = new ComboBoxInfo();
info.cbSize = Marshal.SizeOf(info);
bool ok = GetComboBoxInfo(twin, ref info);
..
}
So ich hoffe das Hilft dir.
IEs ist alle etwas unstrukturiert.
Evt. finde ich ka mal die Zeit ein schönes Demoprogramm zu schreiben.
mfg
Martin
P.S. Falls du nähere Infos brauchst kann ich dir auch Codesegmente per mail schicken.