2

我正在把头发拉出来。我正在尝试向另一个进程中的窗口发送消息。在调用 SendMessage 或 PostMessage 或 PostThreadMessage 后,我不断从 GetLastError() 获得访问被拒绝 (0x5)。我试过关闭UAC。我还通过确保完整性级别与跨进程匹配来说明 UIPI。(我使用 SysInternals 的 Process Explorer 进行了检查,现在是 MS)我也关闭了 Windows Defender,但没有运气。我可以从进程内部向窗口发送消息就好了,但是从外部我得到了bupkus!这似乎是某种安全问题,但我不知道它是什么,因为两个进程具有相同的完整性级别(中 - 十进制 8192)

来自 DLL 的代码发送消息

UINT MsgCode = ::RegisterWindowMessage(_T("MESSAGE_CODING_STRING"));
::ChangeWindowMessageFilter(MsgCode,MSGFLT_ADD);
::PostMessage(hwnd1,MsgCode,(WPARAM)1,(LPARAM)1);
DWORD errorcode = ::GetLastError();

从接收窗口中选择的代码

BEGIN_MESSAGE_MAP(CMessageMailBox, CDialog)
    ON_REGISTERED_MESSAGE(MsgCode, TextFromApp)
END_MESSAGE_MAP()

// Class Constructor    
CMessageMailBox::CMessageMailBox(CWnd* pParent /*=NULL*/)
        : CDialog(CMessageMailBox::IDD, pParent){
       MsgCode = ::RegisterWindowMessage(_T("MESSAGE_CODING_STRING"));
       ::ChangeWindowMessageFilter(MsgCode,MSGFLT_ADD);
    }

//Message Handler   
    afx_msg LRESULT CMessageMailBox::TextFromApp(WPARAM wParam,LPARAM lParam){
        ::MessageBox(NULL,L"message recieved",L"yea!",MB_OK);
        return 0L;
    }
4

2 回答 2

2

一定要留言吗?不同进程之间有多种通信方式:

  • 管道
  • 插座
  • 共享内存
  • 文件
于 2009-05-29T05:35:07.040 回答
2

看起来这是用户界面特权隔离(UIPI)的情况(也就是说,如果您的 DLL 被加载到另一个进程)

在接收进程上使用ChangeWindowMessageFilterEx 。我希望它会工作

于 2015-06-22T14:11:15.573 回答