代码之家  ›  专栏  ›  技术社区  ›  Charlie

sendmessage wm_settext无法在来自mfc应用程序的另一个应用程序上工作

  •  -2
  • Charlie  · 技术社区  · 7 年前

    我试图将文本从另一个应用程序的编辑控件中设置为一个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 回复  |  直到 7 年前
        1
  •  3
  •   Charlie    7 年前

    我在sendMessage()之后调用了getLastError(),即使sendMessage()返回了0。最后一个错误是5,访问被拒绝。由uipi引起。

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

    结果我只需要以管理员身份运行visual studio,然后以管理员身份以调试模式运行我的应用程序。这也意味着最终的应用程序将始终需要在管理员模式下运行,但这将是好的。

    推荐文章