我正在尝试更改另一个应用程序中静态控件的文本。
我无法使用程序中的WM_SETTEXT更改其文本。(目标应用有一些机制可以防止这种情况(
所以我向目标应用程序注入了一个库。在库中,我对静态控件进行了子类化。
WNDPROC wndProcOrig;
LRESULT CALLBACK SubclassWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_SETTEXT:
DefWindowProc(hWnd, uMsg, wParam, (LPARAM)"1234");
return TRUE;
case WM_USER + 5003:
return TRUE;
}
return CallWindowProc(wndProcOrig, hWnd, uMsg, wParam, lParam);
}
wndProcOrig = (WNDPROC)SetWindowLongPtr(textHandle, GWLP_WNDPROC, (LONG_PTR)SubclassWndProc);
我使用窗口侦探将文本设置为静态,当我调试时,我可以在SubclassWndProc中中断程序。
我观察到的:
- 子类WndProc被调用。
- lParam 的字符串始终为空(该值由目标应用修改(
- 调用函数后,文本仍为空(不是"1234"(
问题:
- 目标应用如何修改消息值?
- ">DefWindowProc"是程序员可以用来更改静态控件文本的最底层API吗?如果没有,更改静态控件文本的最佳方法是什么?(尝试过SetWindowText,SetDlgItemText,SendMessage with WM_SETTEXT,都不起作用(
是的,DefWindowProc
基本上是最低级别,但窗口不必使用它,它可以直接回答WM_GETTEXT
。
尝试将WM_GETTEXT
和WM_SETTEXT
直接传递给DefWindowProc
。