首页
社区
课程
招聘
在回调函数里创建对话框失败
发表于: 2015-10-6 16:02 3751

在回调函数里创建对话框失败

2015-10-6 16:02
3751
[ATTACH][/ATTACH]我是想通过setwindowshookex用dll给Traceme.exe安装一个键盘钩子,捕获传给traceme。exe的F5键盘消息进行处理,当捕获的F5时创建一个对话框,编译没问题可是创建对话框显示程序出现异常,p—>Create(ID_DIALOG1)这句话有问题。请大神帮我看看我的程序哪里出问题了
这是dll代码
void show()
{
  CTest *test;
  test->Create(IDD_DIALOG1);
  test->ShowWindow(SW_SHOW);
  
}
LRESULT CALLBACK KeyboardProc(int code,WPARAM wParam,LPARAM lParam)
{
  AFX_MANAGE_STATE(AfxGetModuleState());

  //AfxMessageBox("s/");
  if((wParam==VK_F5)&&(lParam&(1<<31))==0)
  {//mydlg *p=NULL;
    AfxMessageBox("s/");

  show();
    //  CTest *test=NULL;
  //test->Create(IDD_DIALOG1);
  //test->ShowWindow(SW_SHOW);
           //if(p==NULL)
      // {
         //p=new mydlg;
         //p->Create(IDD_DIALOG1,NULL);
         //p->ShowWindow(SW_SHOW);

      // }
       //p->ShowWindow(SW_SHOW);
  }
return CallNextHookEx(NULL,code,wParam,lParam);
}
 void how()
{
  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  HWND hwnd=::FindWindow(NULL,"TraceMe 动态分析技术");
    if(!hwnd)
{
    AfxMessageBox("未打开程序");
    return ;
  }
  DWORD Pid=NULL;
DWORD Tid=NULL;
Tid=GetWindowThreadProcessId(hwnd,&Pid);
HHOOK hook=NULL;

  hook=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("201510063.dll"),Tid);
if(hook==NULL)
AfxMessageBox("钩子失败");
}

调用dll的mfc
void CTestdllDlg::OnButton1() 
{
  HINSTANCE hInst=LoadLibrary("201510063.dll");
 p a;
a=(p)GetProcAddress(hInst,"how");// TODO: Add your control notification handler code here
  a();
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
坐沙发
2015-10-6 16:49
0
雪    币: 5467
活跃值: (1435)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
show函数改一下,把其中的test改成全局变量或成员变量:

        AFX_MANAGE_STATE(AfxGetStaticModuleState());
        CWnd *pCWnd = CWnd::GetForegroundWindow();
        if (test==NULL)
        {
                test=new CTest;
                test->Create(IDD_DIALOG1,pCWnd);
        }
        test->ShowWindow(SW_SHOW);
2015-10-6 20:38
0
雪    币: 121
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢大神!!!成功了

:GetForegroundWindow();这有什么用?为什么之前我会出错呢》?
2015-10-6 21:41
0
雪    币: 121
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢大神!!!成功了

:GetForegroundWindow();这有什么用?为什么之前我会出错呢》?
2015-10-7 12:00
0
雪    币: 106
活跃值: (609)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
CTest *test;
  test->Create(IDD_DIALOG1);
  test->ShowWindow(SW_SHOW);

这里test这个指针没有对象。 必须调用new CTest() 来创建对话框对象,然后才能调用Create()

  CTest *test = new CTest
2015-10-7 19:40
0
雪    币: 5467
活跃值: (1435)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这个涵数是获得目前的顶层窗口,把这个窗口作为你DLL中窗口的父窗口,不过其实这句没有也没关系的。

你原来会出错应该有三个地方:
1、 AFX_MANAGE_STATE(AfxGetStaticModuleState());没调用;
2、test是局部变量;
3、test对象没new出来。
2015-10-7 19:40
0
游客
登录 | 注册 方可回帖
返回
//