【问题标题】:Unable to get checkbox/radio button state using SendMessage无法使用 SendMessage 获取复选框/单选按钮状态
【发布时间】:2019-03-09 08:12:11
【问题描述】:

情况:

我正在尝试使用使用 User32.dll 的 SendMessage 的第三方程序。我需要能够获取复选框和单选按钮的状态。

使用 Spy++ 来查看消息,当它是一个未选中的复选框时,我会看到“S BM_GETCHECK”和“R BM_GETCHECK fCheck:BST_UNCHECKED”,如果我在选中的复选框上再次发送命令,它仍然会显示 BST_UNCHECKED

retVal 为 0,Marshal.GetLastWin32Error() 也返回 0

理想情况下,我使用的任何东西都应该与 WinXP 和 .NET 2.0 兼容

任何帮助将不胜感激!

相关代码:

using System;
using System.Runtime.InteropServices;

[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

int retValB = (int)SendMessage(hWnd, 0x00F0, IntPtr.Zero, IntPtr.Zero);

hWnd 是复选框/单选框的窗口句柄(使用 Spy++ 确认),我也尝试将 0x00F2 和 0xF0F0 作为第二个参数。

【问题讨论】:

  • 在许多使用SendMessage 的情况下,您需要“接收窗口”必须处于活动状态。您可以尝试在发送此消息之前先使用SetActiveWindow 激活窗口吗?
  • 在发送消息之前尝试使用 SetActiveWindow(hWnd) 并没有工作DllImport("user32.dll", SetLastError = true)] public static extern IntPtr SetActiveWindow(IntPtr hWnd);
  • 当窗口消息失败时,请改用 UI 自动化 API。
  • @vasily 真的吗?也许您对 SendInput 感到困惑。
  • @Adam 忘记问题中的所有内容并使用 UI 自动化

标签: c# winapi pinvoke user32


【解决方案1】:

是否需要使用 SendMessage?这对我有用(我使用https://bytes.com/topic/net/answers/637107-how-find-out-if-check-box-checked 作为灵感):

using Accessibility;

[DllImport("oleacc.dll", PreserveSig = false)]
[return: MarshalAs(UnmanagedType.Interface)]
public static extern object AccessibleObjectFromWindow(IntPtr hwnd, uint dwId, ref Guid riid);

public static Nullable<bool> isCheckBoxChecked(IntPtr checkBoxHandle)
{
    const UInt32 OBJID_CLIENT = 0xFFFFFFFC;
    const int UNCHECKED       = 1048576;
    const int CHECKED         = 1048592;
    Guid uid = new Guid("618736e0-3c3d-11cf-810c-00aa00389b71");

    IAccessible accObj = (IAccessible)AccessibleObjectFromWindow(checkBoxHandle, OBJID_CLIENT, ref uid);
    object o2 = accObj.get_accState(0);
    if ((int)o2 == UNCHECKED)
    {
        return false;
    }
    else if ((int)o2 == CHECKED)
    {
        return true;
    }
    else
    {
        return null;
    }
}

【讨论】:

    猜你喜欢
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 2019-09-11
    相关资源
    最近更新 更多