【发布时间】:2019-09-12 05:24:44
【问题描述】:
我想获取窗口中复选框的状态。
所以我使用了SendMessage(hwnd, BM_GETCHECK, NULL, NULL),但它总是返回 0。为了知道原因,我使用了 GetLastError(),它返回了 5。
在Microsoft's documentation 中,它表示“当消息被 UIPI 阻止时,使用 GetLastError 检索的最后一个错误设置为 5(拒绝访问)。”
所以,经过一番研究,我使用ChangeWindowMessageFilterEx(hwnd, BM_GETCHECK, MSGFLT_ALLOW, 0) 来绕过特权问题。
但ChangeWindowMessageFilterEx() 也给出错误代码 5 并返回 false。
但是,当我使用 ChangeWindowMessageFilter() 时,它返回 true 并给出错误代码 0。但 SendMessage(hwnd, BM_GETCHECK, NULL, NULL) 仍然给出错误代码 5。
方法 1
status = ChangeWindowMessageFilterEx(hwnd, BM_GETCHECK, MSGFLT_ALLOW, 0); //returns false
error = ::GetLastError(); // gives error code 5
chk_state = SendMessage(hwnd, BM_GETCHECK, NULL, NULL);
方法 2
status = ChangeWindowMessageFilter(BM_GETCHECK, MSGFLT_ADD); //returns true
error = ::GetLastError() // gives error code 0
chk_state = SendMessage(hwnd, BM_GETCHECK, NULL, NULL);
error = ::GetLastError(); // gives error code 5
我在这里做错了什么?
【问题讨论】:
-
ChangeWindowMessageFilter由 target 进程调用,以允许低权限应用向其发送消息。如果任何进程都可以更改另一个应用程序的过滤器,这将不是一个很好的安全机制吗? -
尝试以管理员权限运行您的代码。
-
另外,子窗口控件的HWND id如何能够首先向它发送消息? EnumChildWindows?
-
@JonathanPotter 我是新手。所以如果我错了请原谅我。如果我不能调用 ChangeWindowMessageFilter,那么就没有办法从我的程序中更改权限,是吗?当我检查我的进程时,它以中等完整性运行。但是我找不到我的程序试图向其发送消息的窗口的完整性。另外,我很困惑如何从该窗口的进程中调用 ChangeWindowMessageFilter。我是不是迷路了?
-
如果您的低权限进程可以通过调用函数简单地从高权限进程中禁用 UIPI,那么 UIPI 将毫无意义。您需要要求目标进程的作者更改他们的代码以让您进入。他们不太可能会这样做。因此,请以管理员权限运行您的进程。