Вобщем понадобилось искать окошки на форме по классу.
Есть такая функция
public TWindow Find<TWindow>(string text) where TWindow : Window, new()
{
var windowInfo = new WindowInfo
{
ClassName = GetWindowClass<TWindow>(),
Text = text,
Handle = IntPtr.Zero
};
IntPtr lParam = IntPtr.Zero;
try
{
lParam = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(WindowInfo)));
Marshal.StructureToPtr(windowInfo, lParam, true); <--- ***********************
NativeMethods.EnumChildWindows(Handle, WindowFinder, lParam);
windowInfo = (WindowInfo)Marshal.PtrToStructure(lParam, typeof(WindowInfo));
if (windowInfo.Handle == IntPtr.Zero)
return null;
return new TWindow { Handle = windowInfo.Handle };
}
finally
{
Marshal.FreeHGlobal(lParam);
}
}
которая со страшной силой крушит приложение или AccessViolationExeption в указаном месте.
За основу взял
этот кодАвтор: Vladek
Дата: 15.06.09
.
Более простой вариант работает без проблем
static void FindWindow()
{
IntPtr hWndE = panelTT.handle;
if (hWndE != IntPtr.Zero)
{
EnumChildProcDelegate enumChildProc = new EnumChildProcDelegate(EnumChildProc);
EnumChildWindows(hWndE, enumChildProc, hWndE);
}
}
static bool EnumChildProc(IntPtr hWnd, IntPtr lParam)
{
const int CAPACITY = 256;
StringBuilder className = new StringBuilder(CAPACITY);
GetClassName(hWnd, className, CAPACITY);
if (className.ToString() == "Edit")
{
_wndHandler = hWnd
return false;
}
return true;
}
Но почему падает вышестоящий не пойму. Подскажите куда копать...
Здравствуйте, Аноним, Вы писали:
А>Но почему падает вышестоящий не пойму. Подскажите куда копать...
У тебя наверняка попытка записи в память меньшую по размеру, чем память которую занимает структура. Нормально опиши текстовые поля, чтобы Marshal.SizeOf(typeof(WindowInfo)) возвращал точное значение размера структуры. Пользуй атрибут MarshalAs, и смотри описание вызываемой функции, какого типа строки нужны в структуре.
Здравствуйте, Аноним, Вы писали:
Если FW>=3 можно так(приблизительно):
using System.Windows.Automation;
AutomationElement formWindow = AutomationElement.FromHandle(this.Handle);
Condition propCondition = new PropertyCondition(AutomationElement.ClassNameProperty, "Edit");
AutomationElement mfWindow = formWindow.FindFirst(TreeScope.Descendants, propCondition);//есть также FindAll :)
но это только найти окна.