问题的内容是这样的:
一个全局键盘钩子(DLL)测试通过
LRESULT __declspec(dllexport)__stdcall  CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
{
switch(wParam)
{ case 'A':pWnd->SendMessage(WM_KEYDOWN,0x41,0); break;
case 'D': pWnd->SendMessage(WM_KEYDOWN,0x44,0);break;
case ' ': AfxMessageBox("空格");
}   }  LRESULT RetVal = CallNextHookEx( hkb, nCode, wParam, lParam );
return  RetVal;
}
其中pWnd是一个CWnd的指针,全局变量,其初始化为
pWnd=::AfxGetMainWnd( );
现在要让它往调用它EXE程序的窗口发WM_CHAR消息,当EXE成序是当前窗口时,成功,但它处于非激活状态时,窗口却收不到消息,请问要怎么改???

解决方案 »

  1.   

    一个笨办法。你在发之前把窗口设置成激活,用sendmessage发完后再设置不激活。试试吧。
      

  2.   

    你最好是在DLL的启动钩子程序中设置一个参数 将EXE的pWnd传给动态连接库 这个问题不久解决了嘛
    老大该给分了 呵呵
      

  3.   

    http://www.csdn.net/expert/topic/783/783417.xml?temp=.2118189
      

  4.   

    用什么函数取得调用它的EXE程序的句柄
      

  5.   

    直接使用SENDMESSAGE就可以了 啊
      

  6.   

    第一个参数从哪里得出来HWND参数
      

  7.   

    DLL中调用主窗口中的函数?能吗?
      

  8.   

    example:
    in dll
    tatic LRESULT CALLBACK LauncherHook(int nCode, WPARAM wParam, LPARAM lParam)
    {
    if((lParam & 0x80000000)&&(HC_ACTION==nCode))
    {
    switch (wParam)
    {
    case '1':
    { HWND hwnd=FindWindow(NULL,"MAIN WINDOW");
    if(hwnd!=NULL)
    SendMessage(hwnd,WM_KEYDOWN,0x41,0);  else
    AfxMessageBox("hwnd is NULL");
    return true;//屏蔽按键之前的功能
    }
    break;
    default :
    break;
    }
    }
    ::CallNextHookEx(k_hhook,nCode,wParam,lParam);
    return false;
    }
      

  9.   

    MAIN WINDOW里面的值是什么,比如我的窗口标题叫“测试”,而应用程序名叫TEST,是不是前面那个??
      

  10.   

    怎样取得当前窗口名柄?HWND=??在EXE中得到
      

  11.   

    kingzai() (  )的方法可行,我试了,通了了,就给他,我再试试其它方法,如果其它人的方法也可行,照样给分
      

  12.   

    向EXE程序中向DLL中传HWND当前窗口参数,怎么做,在钩子加载函数中加一个传入参数,那么在EXE程序的初始化函数中应如何写?比如installhook(HWND pwnd)这个pwnd参数在EXE程序中如何得到?
      

  13.   

    不管如何,谢谢大家帮我解决了问题,我做了只有kingzai说的那种方法可以把后台程序激活,我也不知道为什么,当当前窗口处于非活动奖态时,就无法实现,只有活动状态时有效,散他了