RadioButton нажмите на другую форму - PullRequest
2 голосов
/ 04 марта 2010

У нас есть устаревшая программа с графическим интерфейсом, которую мы хотим использовать под управлением программы на C # для вычисления некоторых значений. Мы можем успешно ввести значения в элементы управления числовым вводом, нажать кнопку вычисления и прочитать полученные ответы из текстовых полей.

Но мы не можем контролировать пару радиокнопок.

Вызов CheckRadioButton () возвращает код успеха, но элемент управления не меняет состояние. Отправка сообщения BM_CLICK не меняет состояние. Попытки отправки событий WM_LBUTTONDOWN и WM_LBUTTONUP не изменили состояние.

Кто-нибудь был успешен в "дистанционном управлении" радиокнопками?

Части кода, иллюстрирующие то, что мы делаем:

[DllImport("user32.dll", EntryPoint="SendMessage")]
public static extern int SendMessageStr(int hWnd, uint Msg, int wParam, string lParam);

[DllImport("user32.dll")]
public static extern int SendMessage(int hWnd, uint Msg, long wParam, long lParam);

[DllImport("user32.dll", EntryPoint="FindWindow", SetLastError=true)]
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

[DllImport("user32.dll", EntryPoint="CheckRadioButton")]
public static extern bool CheckRadioButton(IntPtr hwnd, int firstID, int lastID, int checkedID);

static IntPtr GetControlById(IntPtr parentHwnd, int controlId) {
  IntPtr child = new IntPtr(0);
  child = GetWindow(parentHwnd, GetWindow_Cmd.GW_CHILD);
  while (GetWindowLong(child.ToInt32(), GWL_ID) != controlId) {
    child = GetWindow(child, GetWindow_Cmd.GW_HWNDNEXT);
    if (child == IntPtr.Zero) return IntPtr.Zero;
  }
  return child;
}

// find the handle of the parent window
IntPtr ParenthWnd = new IntPtr(0);    
ParenthWnd = FindWindowByCaption(IntPtr.Zero, "Legacy Window Title");

// set "N" to 10
IntPtr hwndN = GetControlById(ParenthWnd, 17);
SendMessageStr(hwndN.ToInt32(), WM_SETTEXT, 0, "10");

// press "compute" button (seems to need to be pressed twice(?))
int hwndButton = GetControlById(ParenthWnd, 6).ToInt32();
SendMessage(hwndButton, BM_CLICK, 0, 0);
SendMessage(hwndButton, BM_CLICK, 0, 0);

// following code runs succesfully, but doesn't toggle the radio buttons
bool result = CheckRadioButton(ParenthWnd, 12, 13, 12);

Ответы [ 2 ]

1 голос
/ 04 марта 2010

Отправьте сообщение BM_SETCHECK . Обязательно используйте такой инструмент, как Spy ++, чтобы увидеть сообщения.

0 голосов
/ 04 марта 2010

в этом случае я использовал другое сообщение BM_SETSTATE

<code>SendMessage((IntPtr)hWnd, Win32Api.BM_SETSTATE, (IntPtr)newState, IntPtr.Zero);
...