none
win7 向其他窗口发送消息 RRS feed

  • 问题

  • 我想向其他窗口发送消息: 

    HWND hWnd = (HWND)FindWindow(NULL,"xxxxx");
     
     if(!hWnd)
     { exit(0); }
     
     
     int aa=::PostMessage(hWnd, WM_COMMAND, 57634, 0);

    可是发送不成功,网上找了答案说要用ChangeWindowMessageFilter调整权限,找到了下面的代码,不知怎么用在我的工程里面

    typedef BOOL (WINAPI *_ChangeWindowMessageFilter)( UINT , DWORD); 

    BOOL AllowMeesageForWin7(UINT uMessageID, BOOL bAllow)//注册Win7全局消息

    BOOL bResult = FALSE; 

    HMODULE hUserMod = NULL; 

    hUserMod = LoadLibrary( _T("user32.dll") ); 

    if( NULL == hUserMod ) 

    return FALSE; 


    do
    {
    _ChangeWindowMessageFilter pChangeWindowMessageFilter = (_ChangeWindowMessageFilter)GetProcAddress( hUserMod, "ChangeWindowMessageFilter" ); 

    if( NULL == pChangeWindowMessageFilter ) 

    AfxMessageBox(_T("create windowmessage filter failed")); 

    break;


    bResult = pChangeWindowMessageFilter( uMessageID, bAllow ? 1 : 2 );//MSGFLT_ADD: 1, MSGFLT_REMOVE: 2 
    }while (0);


    if( NULL != hUserMod ) 

    FreeLibrary( hUserMod ); 


    return bResult; 
    }

    2012年3月15日 11:49

答案

  • Honny_yeyh你好!

    typedef BOOL (WINAPI *_ChangeWindowMessageFilter)( UINT , DWORD);  定义了一个函数指针。

    BOOL AllowMeesageForWin7(UINT uMessageID, BOOL bAllow)//注册Win7全局消息 是一个函数。

    但是他们的第二个参数不一样。如果参数一样的话,可以这样使用函数指针:

    _ChangeWindowMessageFilter func;
    
    func=AllowMeesageForWin7;
    
    (*_ChangeWindowMessageFilter)(,); //传入正确的参数。

    对于在调用PostMessage时调用这个函数,你可以尝试下面的代码:

    AllowMeesageForWin7(WM_COMMAND,1);
    int aa=::PostMessage(hWnd, WM_COMMAND, 57634, 0);
    

    祝你好运!


    Helen Zhao [MSFT]
    MSDN Community Support | Feedback to us



    • 已编辑 Helen Zhao 2012年3月19日 6:16
    • 已标记为答案 Honny_yeyh 2012年3月20日 1:18
    • 取消答案标记 Honny_yeyh 2012年3月20日 13:20
    • 已标记为答案 Helen Zhao 2012年4月5日 2:57
    2012年3月19日 5:40

全部回复

  • 你获取的句柄正确么

    这个方法应该是好用的


    新浪微博http://weibo.com/xianglitian,欢迎围观

    2012年3月16日 0:33
  • 你获取的句柄正确么

    这个方法应该是好用的


    新浪微博http://weibo.com/xianglitian,欢迎围观


    前后两端代码没有任何的关联,前面是我写的代码,能获取句柄,只是不能postmessage,后面的代码是取得权限,现在是怎么把两端代码关联,然后postmessage成功返回ture
    2012年3月16日 2:19
  • 发送有没有成功?您可以使用Spy++看看目标窗口是否收到该消息?

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2012年3月16日 5:09
    版主
  • 发送有没有成功?您可以使用Spy++看看目标窗口是否收到该消息?

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.


    没有发送成功,我的问题是怎么调整ChangeWindowMessageFilter权限,现在问题是权限的问题,而后面的代码BOOL AllowMeesageForWin7(UINT uMessageID, BOOL bAllow)到底应该怎么调用
    2012年3月16日 8:37
  • typedef BOOL (WINAPI *_ChangeWindowMessageFilter)( UINT , DWORD); 

    BOOL AllowMeesageForWin7(UINT uMessageID, BOOL bAllow)//注册Win7全局消息

    BOOL bResult = FALSE; 

    HMODULE hUserMod = NULL; 

    hUserMod = LoadLibrary( _T("user32.dll") ); 

    if( NULL == hUserMod ) 

    return FALSE; 


    do
    {
    _ChangeWindowMessageFilter pChangeWindowMessageFilter = (_ChangeWindowMessageFilter)GetProcAddress( hUserMod, "ChangeWindowMessageFilter" );

    if( NULL == pChangeWindowMessageFilter ) 

    AfxMessageBox(_T("create windowmessage filter failed")); 

    break;


    bResult = pChangeWindowMessageFilter( uMessageID, bAllow ? 1 : 2 );//MSGFLT_ADD: 1, MSGFLT_REMOVE: 2
    }while (0);


    if( NULL != hUserMod ) 

    FreeLibrary( hUserMod ); 


    return bResult; 
    }
    • 已合并 Helen Zhao 2012年3月19日 6:09 相同的问题
    2012年3月17日 12:12
  • ChangeWindowMessageFilter Function





    Adds or removes a message from the User Interface Privilege Isolation (UIPI)
    message filter.


    Syntax


    BOOL ChangeWindowMessageFilter(      

    UINT message, DWORD dwFlag );
    Minimum DLL Version user32.dll
    Header Declared in Winuser.h, include Windows.h
    Import library User32.lib
    Minimum operating systems Windows Vista

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2012年3月17日 12:25
    版主
  • 比方说,我想发送下面的消息:

    ::PostMessage(hWnd, WM_COMMAND, 57634, 0);

    我怎么调用上面的函数?

    ChangeWindowMessageFilter(     

        UINT message,
        DWORD dwFlag
    );

    2012年3月17日 23:16
  • Honny_yeyh你好!

    typedef BOOL (WINAPI *_ChangeWindowMessageFilter)( UINT , DWORD);  定义了一个函数指针。

    BOOL AllowMeesageForWin7(UINT uMessageID, BOOL bAllow)//注册Win7全局消息 是一个函数。

    但是他们的第二个参数不一样。如果参数一样的话,可以这样使用函数指针:

    _ChangeWindowMessageFilter func;
    
    func=AllowMeesageForWin7;
    
    (*_ChangeWindowMessageFilter)(,); //传入正确的参数。

    对于在调用PostMessage时调用这个函数,你可以尝试下面的代码:

    AllowMeesageForWin7(WM_COMMAND,1);
    int aa=::PostMessage(hWnd, WM_COMMAND, 57634, 0);
    

    祝你好运!


    Helen Zhao [MSFT]
    MSDN Community Support | Feedback to us



    • 已编辑 Helen Zhao 2012年3月19日 6:16
    • 已标记为答案 Honny_yeyh 2012年3月20日 1:18
    • 取消答案标记 Honny_yeyh 2012年3月20日 13:20
    • 已标记为答案 Helen Zhao 2012年4月5日 2:57
    2012年3月19日 5:40
  • Honny_yeyh你好!

    我发现你在Visual C++ 论坛还有一个帖子,而且这两个帖子的问题是相同的,所以我要把这个帖子合并过去。

    谢谢你的谅解!

    祝你好运!


    Helen Zhao [MSFT]
    MSDN Community Support | Feedback to us

    2012年3月19日 6:09
  • Honny_yeyh你好!

    typedef BOOL (WINAPI *_ChangeWindowMessageFilter)( UINT , DWORD);  定义了一个函数指针。

    BOOL AllowMeesageForWin7(UINT uMessageID, BOOL bAllow)//注册Win7全局消息 是一个函数。

    但是他们的第二个参数不一样。如果参数一样的话,可以这样使用函数指针:

    _ChangeWindowMessageFilter func;
    
    func=AllowMeesageForWin7;
    
    (*_ChangeWindowMessageFilter)(,); //传入正确的参数。

    对于在调用PostMessage时调用这个函数,你可以尝试下面的代码:

    AllowMeesageForWin7(WM_COMMAND,1);
    int aa=::PostMessage(hWnd, WM_COMMAND, 57634, 0);
    

    祝你好运!


    Helen Zhao [MSFT]
    MSDN Community Support | Feedback to us




    AllowMeesageForWin7(WM_COMMAND,1);
    int aa=::PostMessage(hWnd, WM_COMMAND, 57634, 0);  //这里aa还是返回0
    2012年3月20日 13:22
  • #define MSGFLT_ADD 1

    #define MSGFLT_REMOVE 2

    AllowMeesageForVistaAbove(SPI_SETANIMATION, MSGFLT_ADD);                //在这里加了这一句不知道什么意思

    //allow drop files
    AllowMeesageForVistaAbove(WM_command, MSGFLT_ADD);

    2012年3月20日 13:39

  •  BOOL fqf=AllowMeesageForWin7(SPI_SETANIMATION,1);   //这里返回1


     BOOL ff=AllowMeesageForWin7(WM_COMMAND,1);     //这里返回1
     

     int aa=::PostMessage(hWnd, WM_COMMAND, 57634, 0);   //这里返回0,失败

    是不是wm_command有很多的flag? 比方有1,2,3...

    AllowMeesageForWin7(WM_COMMAND,1); 

    应该写成

    AllowMeesageForWin7(WM_COMMAND,2。。); 

    2012年3月20日 13:42