【问题标题】:SendMessage WM_SETTEXT does not work on another application from MFC applicationSendMessage WM_SETTEXT 在 MFC 应用程序的另一个应用程序上不起作用
【发布时间】:2019-02-03 18:33:52
【问题描述】:

我正在尝试在 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
}

【问题讨论】:

  • 检查SendMessage的返回值。如果它指示错误,请致电GetLastError 找出失败的原因。
  • 是什么让您认为窗口类WindowsForms10.EDIT.app.0.378734a 可以识别WM_SETTEXT 消息?
  • SendMessage 的返回值为 0。我认为这意味着没有错误。
  • 它与我测试过的其他应用程序相同的窗口类可以识别 WM_TEXT。所以是的,这是一种假设,但我对 WM_CHAR 也有同样的问题。当我在 Spy++ 中记录消息时,我验证键盘输入发送 WM_CHAR 并输入文本。当我尝试使用 SendMessage 时它不起作用
  • 控件是否只接受IP地址格式?如果是,您为什么要尝试寄信?

标签: c++ winforms winapi mfc


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多