FindWindowEx - Выбрать текстовое поле, если есть несколько текстовых полей с одинаковым именем класса - PullRequest
1 голос
/ 01 февраля 2010

Я хочу использовать SendMessage / PostMessage для отправки некоторых ключей в текстовое поле приложения. Я использовал Microsoft Spyxx, чтобы получить имя класса этого текстового поля. Теперь у меня проблема в том, что в этом приложении есть несколько текстовых полей с одинаковым именем класса («WindowsForms10.EDIT.app.0.2e0c681») и одинаковым именем окна.

Как получить ручку правильной?

PS: я пишу на c # с Visual C # 2008 Express

Ответы [ 2 ]

0 голосов
/ 23 февраля 2010

Если разные значения hWnd возвращают одинаковые результаты для функций API

[DllImport( "user32.dll" )]
public static extern int GetClassNameW( HandleRef hWnd, [MarshalAs( UnmanagedType.LPWStr )] StringBuilder className, int nMaxCount );

[DllImport( "user32.dll" )]
public static extern int GetWindowTextLength( HandleRef hWnd );

[DllImport( "user32.dll" )]
public static extern int GetWindowTextW( HandleRef hWnd, [MarshalAs( UnmanagedType.LPWStr )] StringBuilder text, int maximum );

Вы можете застревать в необходимости вносить изменения, основываясь на положении, в котором объекты существуют в форме

public struct WindowPlacement {
  public int length;
  public int flags;
  public int showCmd;
  public Point minPosition;
  public Point maxPosition;
  public Rectangle normalPosition;
}

[DllImport( "user32.dll" )]
public static extern bool GetWindowPlacement( HandleRef hWnd, ref WindowPlacement position );
0 голосов
/ 22 февраля 2010

Ну, должно быть что-то, что вы знаете о текстовом поле, которое вы могли бы использовать: например, вы можете найти текстовое поле с определенным владельцем и проверить, что представляет собой предыдущее дочернее окно ... Если элемент управления имеет меткуВы можете сначала найти ярлык, а затем справа от него найти элемент управления.

...