window handle

martinpriebe

Erfahrenes Mitglied
Hallo,


ich habe per EnumWindows() und GetWindowText() mir ein window handle geholt.

nun möchte ich das fenster des handles näher untersuchen.

alle enthaltenen steuerelemente durchlaufen oder ähnliches.
oder an genau dieses fenster tastaturbefehle senden.

Control.FromHandle(whandle) - bringt leider null.

geht soetwas ?


danke im vorraus
Martin
 
Hi,

habe die entsprechenden messages gefunden.
Kann jetzt alle Elemente auslesen, Namen auslesen, Namen setzen, ID auslesen, Clicks setzen, Elemente in Listbox und Combobox setzen, Edit Felder ändern, Buttons drücken usw.

mfg
Martin
 
Wäre schön gewesen, wenn du dein Ergebnis, auch den anderen hier im Forum mal Präsentieren würdest.

So hätte ich jetzt z.B. schonmal eine Hilfe gehabt :-(


mFg
 
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.
 

Neue Beiträge

Zurück