代码之家  ›  专栏  ›  技术社区  ›  Mark T

单选按钮单击另一个窗体

  •  2
  • Mark T  · 技术社区  · 14 年前

    我们有一个带有GUI的遗留程序,我们想在C程序的控制下使用它来计算一些值。我们可以成功地在数字输入控件中输入值,按下计算按钮,并从文本显示框中读取生成的答案。

    但是 我们似乎无法控制一对单选按钮。

    发送BM\u CLICK消息不会更改状态。

    有人成功地“遥控”单选按钮吗?

    部分代码来说明我们在做什么:

    [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 回复  |  直到 14 年前
        1
  •  1
  •   Hans Passant    14 年前

    BM_SETCHECK message . 一定要使用Spy++这样的工具来查看消息。

        2
  •  0
  •   Yevhen    14 年前

    在本例中,我使用了另一个消息BM_SETSTATE

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