【发布时间】: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 自动化