首页
社区
课程
招聘
[求助]dll 创建窗口问题
发表于: 2010-3-5 14:37 4377

[求助]dll 创建窗口问题

2010-3-5 14:37
4377
下面代码编译成dll 我用另一个程序 LoadLibrary 123.dll 会创建窗口,用热键也可以
但是把这个 dll 注入到其他程序则不能创建窗口,注入后 MessageBox(NULL,"DLL_PROCESS_ATTACH",NULL,MB_OK); 都会提示
请问是为什么?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// 123.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "resource.h"
 
 
#define WH_KEYBOARD_LL 13
typedef struct tagKBDLLHOOKSTRUCT {
    DWORD vkCode;
    DWORD scanCode;
    DWORD flags;
    DWORD time;
    DWORD dwExtraInfo; 
} KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
 
 
HINSTANCE hinst = NULL;
HWND hwndDLG = NULL;
HHOOK hhook = NULL;
HANDLE hProc;
 
 
LRESULT CALLBACK mykeyproc(int,WPARAM,LPARAM);
void WINAPI start();
BOOL CALLBACK DlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam);   
extern "C" __declspec(dllexport) void ShowDlg();
 
//dll入口
BOOL APIENTRY DllMain( HANDLE hModule,
                      DWORD  ul_reason_for_call,
                      LPVOID lpReserved
                      )
{
    switch( ul_reason_for_call )
    {
    case DLL_PROCESS_ATTACH:
        hinst = (HINSTANCE)hModule;
        start();
        MessageBox(NULL,"DLL_PROCESS_ATTACH",NULL,MB_OK);
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    case DLL_PROCESS_DETACH:
        MessageBox(NULL,"DLL_PROCESS_DETACH",NULL,MB_OK);
        break;
    }
    return TRUE;
}
 
void WINAPI start()
{
    hhook = SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)mykeyproc,hinst,NULL);
    ShowDlg();
    myhook();
}
 
extern "C" __declspec(dllexport) void ShowDlg()
{    
    hwndDLG = CreateDialog(hinst,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)DlgProc);    
    ShowWindow(hwndDLG,SW_SHOW);
}
 
BOOL CALLBACK DlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)                        
{
    switch(message)
    {
    case WM_INITDIALOG:
        return TRUE;
    case WM_COMMAND:
        /*
        if(LOWORD(wParam)==IDOK)
        {
            MessageBox(NULL,"IDOK",NULL,MB_OK);
        }
        if(LOWORD(wParam)==IDCANCEL)
        {
            MessageBox(NULL,"IDCANCEL",NULL,MB_OK);
        }
        */
        if(LOWORD(wParam)==IDC_CHECK1)
        {
            if (IsDlgButtonChecked(hDlg,IDC_CHECK1)==BST_CHECKED)
            //if (BST_CHECKED == SendDlgItemMessage(hDlg,IDC_CHECK1,BM_GETCHECK,0,0))
            {
                MessageBox(NULL,"IDC_CHECK1",NULL,MB_OK);
            }
            else
            {
                //............................
            }
        }
        return TRUE;
    case WM_CLOSE:
        DestroyWindow(hDlg);
        hwndDLG = NULL;
        return TRUE;
    }
    return FALSE;
}
 
 
 
LRESULT CALLBACK mykeyproc(int dwCode,WPARAM wParam,LPARAM lParam)
{
    PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;
    if (dwCode == HC_ACTION)
    {
        if (wParam == WM_KEYDOWN)
        {
            if (p->vkCode == VK_MULTIPLY)
            {
                if (hwndDLG == NULL)
                {
                    ShowDlg();
                }
                else
                {
                    DestroyWindow(hwndDLG);
                    hwndDLG = NULL;
                }
                //MessageBox(NULL,"VK_NUMLOCK",NULL,MB_OK);
            }
        }
    }
    LRESULT RetVal = CallNextHookEx(hhook,dwCode,wParam,lParam);
    return RetVal;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册