SendMessage WM_SETTEXT无法在MFC应用程序中的其他应用程序上运行

时间:2019-02-03 18:33:53

标签: c++ winforms winapi mfc

我试图在C ++ MFC应用程序的另一个应用程序的“编辑”控件中设置文本。

如果其他应用程序是记事本,则我的代码可以正常工作,但不适用于需要它的应用程序。当我无法使WM_SETTEXT正常工作时,我以为应用程序正在将消息过滤到控件,并且由于键盘输入有效,因此我尝试发送键盘消息。那也没有用。我通过在Spy ++中记录消息来验证该窗口确实收到了键盘输入。我在做错什么或想念什么?

if (g_IPAdressHwnd != 0) // g_IPAdressHwnd is the handle to the Edit control
{
    CWnd *wnd = CWnd::FromHandle(g_IPAdressHwnd);
    wchar_t buff[256];
    wchar_t windowText[256];
    wchar_t className[256];

    BOOL b = IsWindowUnicode(wnd->GetSafeHwnd()); // returns true

    GetClassName(wnd->GetSafeHwnd(), className, 200); // returns "WindowsForms10.EDIT.app.0.378734a"

    wnd->GetWindowText(windowText, 256);    // does not work
    wnd->SendMessage(WM_GETTEXT, 256, (LPARAM)buff); // this works

    wcscpy_s(buff, L"Foo!");
    wnd->SendMessage(WM_SETTEXT, 256, (LPARAM)buff);    // does not work

    wnd->SendMessage(WM_CHAR, L'A', 0);  // does not work
}

1 个答案:

答案 0 :(得分:3)

即使SendMessage()返回0,我仍然在SendMessage()之后调用GetLastError()。最后一个错误是5,这被拒绝访问。由UIPI引起。

我的应用程序需要以更高的完整性级别运行。

结果证明,我只需要以管理员身份运行Visual Studio,然后以管理员身份在调试模式下运行我的应用程序。这也意味着最终的应用程序将始终需要以管理员模式运行才能正常工作,但这会很好。