Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: WinAPI ::  Mousehook     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Gast123
Unregistrierter




Beitrag Gast123 Unregistrierter 20:21:15 11.03.2010   Titel:   Mousehook            Zitieren

Hallo,
ich befasse mich im Moment mit dem Mousehook; Dazu habe ich folgendes Tutorial gefunden:
http://www.tutorials.de/forum/c-c-tutorials/164662-tutorial-ueber-windows-hooks.html

Wenn ich den Code vom Tutorial übernehme, bis auf ein paar Stellen, habe ich als dll.h:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef _DLL_H_
#endif
 /*von mir ergänzt*/
#define
_DLL_H_

#include
<windows.h>

#if
BUILDING_DLL
# define
DLLIMPORT __declspec (dllexport)
#else
# define
DLLIMPORT __declspec (dllimport)
#endif

#pragma
data_seg ("shared")
int i_MyGlobalSharedVariable = 0;
#pragma
data_seg()
#pragma
comment(linker, "/SECTION:shared,RWS")

DLLIMPORT BOOL InstallHook();
DLLIMPORT BOOL UninstallHook();

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef _DLL_H_
#endif
/*von mir ergänzt*/
#define
_DLL_H_

#include
<windows.h>

#if
BUILDING_DLL
# define
DLLIMPORT __declspec (dllexport)
#else
# define
DLLIMPORT __declspec (dllimport)
#endif

#pragma
data_seg ("shared")
int i_MyGlobalSharedVariable = 0;
#pragma
data_seg()
#pragma
comment(linker, "/SECTION:shared,RWS")

DLLIMPORT BOOL InstallHook();
DLLIMPORT BOOL UninstallHook();

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef _DLL_H_
#endif
 /*von mir ergänzt*/
#define
_DLL_H_

#include
<windows.h>

#if
BUILDING_DLL
# define
DLLIMPORT __declspec (dllexport)
#else
# define
DLLIMPORT __declspec (dllimport)
#endif

#pragma
data_seg ("shared")
int i_MyGlobalSharedVariable = 0;
#pragma
data_seg()
#pragma
comment(linker, "/SECTION:shared,RWS")

DLLIMPORT BOOL InstallHook();
DLLIMPORT BOOL UninstallHook();

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam);


und als dllmain.cpp:
C/C++ Code:
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
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
#include "dll.h"

HHOOK g_hMouseHook /*SHARED*/ = NULL; /*steht zwar im Tutorial, ist aber anscheinend falsch*/
HINSTANCE g_hInst /*SHARED*/ = NULL;

BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
{
    g_hInst = hInst;
    return TRUE;
}

DLLIMPORT BOOL InstallHook()
{
    if(g_hMouseHook != NULL)
        return TRUE;

    g_hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, g_hInst, 0);
    if(g_hMouseHook == NULL)
        return FALSE;

    return TRUE;
}

DLLIMPORT BOOL UninstallHook()
{
    if(g_hMouseHook != NULL)
    {
        UnhookWindowsHookEx(g_hMouseHook);
        g_hMouseHook = NULL;
    }
    return TRUE;
}

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(nCode < 0)
        return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);

    if(nCode == HC_ACTION)
    {
        if((wParam == WM_LBUTTONDOWN) || (wParam == WM_NCLBUTTONDOWN))
        {
            MOUSEHOOKSTRUCT *mhs = (MOUSEHOOKSTRUCT*)lParam;
            HWND caller = FindWindow("Pipette", NULL);
            if(caller != NULL)
                PostMessage(caller, WM_USER+123, 0, MAKELPARAM(mhs->pt.x, mhs->pt.y));
        }
    }
    return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
}
C/C++ Code:
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
#include "dll.h"

HHOOK g_hMouseHook /*SHARED*/ = NULL; /*steht zwar im Tutorial, ist aber anscheinend falsch*/
HINSTANCE g_hInst /*SHARED*/ = NULL;

BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
{
g_hInst = hInst;
return TRUE;
}

DLLIMPORT BOOL InstallHook()
{
if(g_hMouseHook != NULL)
return TRUE;

g_hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, g_hInst, 0);
if(g_hMouseHook == NULL)
return FALSE;

return TRUE;
}

DLLIMPORT BOOL UninstallHook()
{
if(g_hMouseHook != NULL)
{
UnhookWindowsHookEx(g_hMouseHook);
g_hMouseHook = NULL;
}
return TRUE;
}

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode < 0)
return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);

if(nCode == HC_ACTION)
{
if((wParam == WM_LBUTTONDOWN) || (wParam == WM_NCLBUTTONDOWN))
{
MOUSEHOOKSTRUCT *mhs = (MOUSEHOOKSTRUCT*)lParam;
HWND caller = FindWindow("Pipette", NULL);
if(caller != NULL)
PostMessage(caller, WM_USER+123, 0, MAKELPARAM(mhs->pt.x, mhs->pt.y));
}
}
return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
}
C/C++ Code:
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
#include "dll.h"

HHOOK g_hMouseHook /*SHARED*/ = NULL; /*steht zwar im Tutorial, ist aber anscheinend falsch*/
HINSTANCE g_hInst /*SHARED*/ = NULL;

BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
{
    g_hInst = hInst;
    return TRUE;
}

DLLIMPORT BOOL InstallHook()
{
    if(g_hMouseHook != NULL)
        return TRUE;

    g_hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, g_hInst, 0);
    if(g_hMouseHook == NULL)
        return FALSE;

    return TRUE;
}

DLLIMPORT BOOL UninstallHook()
{
    if(g_hMouseHook != NULL)
    {
        UnhookWindowsHookEx(g_hMouseHook);
        g_hMouseHook = NULL;
    }
    return TRUE;
}

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(nCode < 0)
        return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);

    if(nCode == HC_ACTION)
    {
        if((wParam == WM_LBUTTONDOWN) || (wParam == WM_NCLBUTTONDOWN))
        {
            MOUSEHOOKSTRUCT *mhs = (MOUSEHOOKSTRUCT*)lParam;
            HWND caller = FindWindow("Pipette", NULL);
            if(caller != NULL)
                PostMessage(caller, WM_USER+123, 0, MAKELPARAM(mhs->pt.x, mhs->pt.y));
        }
    }
    return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
}


Wenn ich das nun kompiliere bekomme ich folgende Fehler:
c:\...\dllmain.cpp(13) : error C2491: 'InstallHook': Definition von Funktion für dllimport nicht zulässig
c:\...\dllmain.cpp(25) : error C2491: 'UninstallHook': Definition von Funktion für dllimport nicht zulässig
c:\...\dllmain.cpp(44) : error C2664: 'FindWindowW': Konvertierung des Parameters 1 von 'const char [8]' in 'LPCWSTR' nicht möglich
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.


Wäre schön, wenn mir jemand weiterhelfen könnte, oder eine Idee hat, wie ich das in den Griff bekomme ;).
Badestrand
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.08.2006
Beiträge: 4342
Beitrag Badestrand Mitglied 14:21:20 13.03.2010   Titel:   Re: Mousehook            Zitieren

Hi,

hast du denn BUILDING_DLL beim Bauen der DLL in den Compiler-Optionen gesetzt? Alternativ kannst du ein #define BUILDING_DLL vor #include "dll.h" in der dllmain.cpp setzen. Du solltest aber auch #if BUILDING_DLL umschreiben zu #ifdef BUILDING_DLL.
Es geht darum, dass in deiner dllmain.cpp DLLIMPORT vor den Funktionsdefinitionen durch __declspec (dllexport) ersetzt wird. Und das wird es nur, wenn BUILDING_DLL "gesetzt" ist.
Mit #ifdef prüfst du übrigens, ob ein Symbol gesetzt ist. Mit #if kannst du z.B. Wertvergleiche durchführen (#if XYZ == 7).

Zwei andere Punkte:
Das von dir ergänzte #endif in der Header-Datei sollte ganz ans Ende der Datei. Das Konzept nennt sich "Include Guards", falls du danach googeln (oder yahoo'n) willst.

Viele Funktionen liegen in der WinAPI in einer Unicode- und einer ASCII-Version vor, auch FindWindow; die Funktionen heißen entsprechend FindWindowW und FindWindowA. Je nachdem, ob du in den Compiler-Optionen das UNICODE-Flag gesetzt hast, wird FindWindow durch den Präprozessor durch eine der beiden Versionen ersetzt. FindWindowW verlangt einen Unicode-String (z.B. L"Hallo"), FindWindowA einen ASCII-String (z.B. "Hallo"). Für deinen FindWindow-Aufruf kannst du dir eine Vorgehensweise aussuchen:
C/C++ Code:
FindWindowA("Pipette", NULL)
FindWindowW(L"Pipette", NULL)
FindWindow(TEXT("Pipette"),NULL)  //<- zu empfehlen
C/C++ Code:
FindWindowA("Pipette", NULL)
FindWindowW(L"Pipette", NULL)
FindWindow(TEXT("Pipette"),NULL) //<- zu empfehlen
C/C++ Code:
FindWindowA("Pipette", NULL)
FindWindowW(L"Pipette", NULL)
FindWindow(TEXT("Pipette"),NULL)  //<- zu empfehlen
Gast123
Unregistrierter




Beitrag Gast123 Unregistrierter 19:02:52 13.03.2010   Titel:   Hauptprogramm            Zitieren

hi,

@ Badestrand: Vielen Dank für deine Hinweise! Damit konnte ich meine .dll ohne Probleme erstellen.
Jetzt arbeite ich gerade am "Hauptprogramm"; Wieder habe ich den Code aus dem Tutorial übernommen und hier und da etwas ergänzt.
Hier der Code: main.h:
C/C++ Code:
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
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
#include <windows.h>
#include
<stdio.h>

/*defines*/

#define
WINDOW_WIDTH 310
#define
WINDOW_HEIGHT 200

#ifndef
GET_X_LPARAM
#define
GET_X_LPARAM(lp)  ((int)(short)LOWORD(lp))
#endif
#ifndef
GET_Y_LPARAM
#define
GET_Y_LPARAM(lp)  ((int)(short)HIWORD(lp))
#endif

typedef bool
(CALLBACK *MYFUNC)(void);

/*Prototypen*/

void Init();
void DrawColor(POINT &p, HWND &mainWindow);
void DrawDialog(HWND &parent, HINSTANCE &inst);
void ToHTML();
void ToRGB();
bool IsPointInApp(POINT &p, HWND &mainWindow);
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*Globale Variablen*/

MYFUNC InstallHook;
MYFUNC UninstallHook;

HWND hInstallHookBtn;
HWND hUninstallHookBtn;
HWND hEditRGB;
HWND hEditHTML;
HWND hStaticFrame;

COLORREF col;
RECT ColorRect;

char szClassName[ ] = "Pipette";
C/C++ Code:
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
#include <windows.h>
#include
<stdio.h>

/*defines*/

#define
WINDOW_WIDTH 310
#define
WINDOW_HEIGHT 200

#ifndef
GET_X_LPARAM
#define
GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
#endif
#ifndef
GET_Y_LPARAM
#define
GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
#endif

typedef bool
(CALLBACK *MYFUNC)(void);

/*Prototypen*/

void Init();
void DrawColor(POINT &p, HWND &mainWindow);
void DrawDialog(HWND &parent, HINSTANCE &inst);
void ToHTML();
void ToRGB();
bool IsPointInApp(POINT &p, HWND &mainWindow);
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*Globale Variablen*/

MYFUNC InstallHook;
MYFUNC UninstallHook;

HWND hInstallHookBtn;
HWND hUninstallHookBtn;
HWND hEditRGB;
HWND hEditHTML;
HWND hStaticFrame;

COLORREF col;
RECT ColorRect;

char szClassName[ ] = "Pipette";
C/C++ Code:
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
#include <windows.h>
#include
<stdio.h>

/*defines*/

#define
WINDOW_WIDTH 310
#define
WINDOW_HEIGHT 200

#ifndef
GET_X_LPARAM
#define
GET_X_LPARAM(lp)  ((int)(short)LOWORD(lp))
#endif
#ifndef
GET_Y_LPARAM
#define
GET_Y_LPARAM(lp)  ((int)(short)HIWORD(lp))
#endif

typedef bool
(CALLBACK *MYFUNC)(void);

/*Prototypen*/

void Init();
void DrawColor(POINT &p, HWND &mainWindow);
void DrawDialog(HWND &parent, HINSTANCE &inst);
void ToHTML();
void ToRGB();
bool IsPointInApp(POINT &p, HWND &mainWindow);
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*Globale Variablen*/

MYFUNC InstallHook;
MYFUNC UninstallHook;

HWND hInstallHookBtn;
HWND hUninstallHookBtn;
HWND hEditRGB;
HWND hEditHTML;
HWND hStaticFrame;

COLORREF col;
RECT ColorRect;

char szClassName[ ] = "Pipette";


und main.cpp:
C/C++ Code:
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
#include "main.h"

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
{
    HWND hwnd;
    MSG messages;
    WNDCLASSEX wincl;

    Init();

    /*The window structure*/

    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;
    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof (WNDCLASSEX);

    /*Use default icon and mouse-pointer*/

    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /*Register the window class, and if it fails quit the program*/

    if(!RegisterClassEx (&wincl))
        return 0;

    /*The class is registered, let's create the prgram*/

    hwnd = CreateWindowExA(
                          0,
                          szClassName,
                          "Pipette",
                          WS_SYSMENU|WS_MINIMIZEBOX,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          WINDOW_WIDTH,
                          WINDOW_HEIGHT,
                          HWND_DESKTOP,
                          NULL,
                          hThisInstance,
                          NULL
                          ); //CreateWindowA von mir ergänzt

    DrawDialog(hwnd, hThisInstance);

    /*Make the window visible on the screen*/

    ShowWindow (hwnd, nFunsterStil);

    HINSTANCE hDLL = LoadLibraryA("mousehook.dll"); //LoadLibraryA von mir ergänzt
    if(hDLL == NULL)
    {
        MessageBoxA(NULL, "Fehler beim Laden der DLL: mousehook.dll", "Fehler", MB_OK); //MessageBoxA von mir ergänzt
        return FALSE;
    }

    InstallHook = (MYFUNC) GetProcAddress(hDLL, "InstallHook");
    if(InstallHook = NULL)
    {
        MessageBoxA(NULL, "Fehler: InstallHook nicht gefunden in: mousehook.dll", "Fehler", MB_OK);
        return FALSE;
    }

    UninstallHook = (MYFUNC) GetProcAddress(hDLL, "UninstallHook");
    if(UninstallHook == NULL)
    {
        MessageBoxA(NULL, "Fehler: UninsatllHook nicht gefunden in: mousehook.dll", "Fehler", MB_OK);
        return FALSE;
    }

    /*Run the message loop. It will run until GetMessage() returns 0*/
    while(GetMessage(&messages, NULL, 0, 0))
    {
        /*Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /*Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave*/
    FreeLibrary(hDLL);
    return messages.wParam;
}

void Init()
{
    InstallHook = NULL;
    UninstallHook = NULL;

    hInstallHookBtn = NULL;
    hUninstallHookBtn = NULL;
    hEditRGB = NULL;
    hEditHTML = NULL;
    hStaticFrame = NULL;

    col = RGB(0,0,0);
    ColorRect.left = 10;
    ColorRect.top = 120;
    ColorRect.right = 290;
    ColorRect.bottom = 160;
}

void DrawDialog(HWND &parent, HINSTANCE &inst)
{
    hInstallHookBtn = CreateWindowA("BUTTON", 0, WS_CHILD|WS_VISIBLE, 10, 10, 120, 30, parent, 0, inst, 0); //CreateWindowA von mir ergänzt
    SetWindowTextA(hInstallHookBtn, "Install Hook"); //SetWindowTextA von mir ergänzt
    hUninstallHookBtn = CreateWindowA("BUTTON", 0, WS_CHILD|WS_VISIBLE, 170, 10, 120, 30, parent, 0, inst, 0);
    SetWindowTextA(hUninstallHookBtn, "Uninstall Hook");

    HWND tmp;
    tmp = CreateWindowA("STATIC", 0, WS_CHILD|WS_VISIBLE, 10, 60, 100, 18, parent, 0, inst, 0);
    SetWindowTextA(tmp, "RGB Farbe:");
    tmp = CreateWindowA("STATIC", 0, WS_CHILD|WS_VISIBLE, 10, 90, 100, 18, parent, 0, inst, 0);
    SetWindowTextA(tmp, "HTML Farbe:");

    hEditRGB = CreateWindowA("EDIT", 0, WS_BORDER|WS_CHILD|WS_VISIBLE|ES_READONLY, 120, 59, 100, 20, parent, 0, inst, 0);
    hEditHTML = CreateWindowA("EDIT", 0, WS_BORDER|WS_CHILD|WS_VISIBLE|ES_READONLY, 120, 89, 100, 20, parent, 0, inst, 0);
    //hStaticFrame = CreateWindow("STATIC", 0, WS_BORDER|WS_CHILD|WS_VISIBLE, 10, 120, 280, 40, parent, 0, inst, 0);
}

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HWND hBut;
    static HBRUSH brush;

    switch (message)
    {
    case WM_COMMAND:
        if(HIWORD(wParam) == BN_CLICKED)
        {
            hBut = (HWND)lParam;
            if(hBut == hInstallHookBtn)
            {
                BOOL ret = InstallHook();
                if(ret == FALSE)
                    MessageBoxA(NULL, "InstallHook fehlgeschlagen", "Fehler", MB_OK);
                else
                    SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE |SWP_SHOWWINDOW);
            }
            else if(hBut == hUninstallHookBtn)
            {
                if(UninstallHook() == FALSE)
                    MessageBoxA(NULL, "UninstallHook fehlgeschlagen", "Fehler", MB_OK);
            }
        }
        break;

    case WM_USER+123:
        POINT p;
        p.x = GET_X_LPARAM(lParam);
        p.y = GET_Y_LPARAM(lParam);
        DrawColor(p, hwnd);
        break;

    case WM_PAINT:
        PAINTSTRUCT ps;
        brush = CreateSolidBrush(col);
        HDC dc;
        dc = NULL;
        dc = BeginPaint(hwnd, &ps);
        SelectObject(dc, brush);
        FillRect(dc, &ColorRect, brush);
        EndPaint(hwnd, &ps);
        return 0;

    case WM_DESTROY:
        DeleteObject(brush);
        if(!UninstallHook())
            MessageBoxA(NULL, "UninstallHook fehlgeschlagen", "Fehler", MB_OK);

        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc (hwnd, message, wParam, lParam);
    }
   
    return 0;
}

void DrawColor(POINT &p, HWND &mainWindow)
{
    HWND owner = WindowFromPoint(p);
    if(owner)
    {
        HDC ownerDC = GetDC(owner);
        if(ownerDC && !IsPointInApp(p, mainWindow))
        {
            ScreenToClient(owner, &p);
            col = GetPixel(ownerDC, p.x, p.y);
            ToHTML();
            ToRGB();
            InvalidateRect(mainWindow, &ColorRect, TRUE);
        }
    }
}

void ToHTML()
{
    char sHtml[8]; sHtml[0] = 0;
    sprintf(sHtml, "#%.2X%.2X%.2X", GetRValue(col), GetGValue(col), GetBValue(col));
    SetWindowTextA(hEditHTML, sHtml); //SetWindowTextA von mir ergänzt
}

void ToRGB()
{
    char sRGB[12]; sRGB[0] = 0;
    sprintf(sRGB, "%d, %d, %d", GetRValue(col), GetGValue(col), GetBValue(col));
    SetWindowTextA(hEditRGB, sRGB);
}

bool IsPointInApp(POINT &p, HWND &mainWindow)
{
    RECT rect;
    GetWindowRect(mainWindow, &rect);

    if(p.x >= rect.left &&
        p.x <= rect.right &&
        p.y >= rect.top &&
        p.y <= rect.bottom)
    {
        return true;
    }
    else
        return false
;
}
C/C++ Code:
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
#include "main.h"

int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
{
HWND hwnd;
MSG messages;
WNDCLASSEX wincl;

Init();

/*The window structure*/

wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof (WNDCLASSEX);

/*Use default icon and mouse-pointer*/

wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

/*Register the window class, and if it fails quit the program*/

if(!RegisterClassEx (&wincl))
return 0;

/*The class is registered, let's create the prgram*/

hwnd = CreateWindowExA(
0,
szClassName,
"Pipette",
WS_SYSMENU|WS_MINIMIZEBOX,
CW_USEDEFAULT,
CW_USEDEFAULT,
WINDOW_WIDTH,
WINDOW_HEIGHT,
HWND_DESKTOP,
NULL,
hThisInstance,
NULL
); //CreateWindowA von mir ergänzt

DrawDialog(hwnd, hThisInstance);

/*Make the window visible on the screen*/

ShowWindow (hwnd, nFunsterStil);

HINSTANCE hDLL = LoadLibraryA("mousehook.dll"); //LoadLibraryA von mir ergänzt
if(hDLL == NULL)
{
MessageBoxA(NULL, "Fehler beim Laden der DLL: mousehook.dll", "Fehler", MB_OK); //MessageBoxA von mir ergänzt
return FALSE;
}

InstallHook = (MYFUNC) GetProcAddress(hDLL, "InstallHook");
if(InstallHook = NULL)
{
MessageBoxA(NULL, "Fehler: InstallHook nicht gefunden in: mousehook.dll", "Fehler", MB_OK);
return FALSE;
}

UninstallHook = (MYFUNC) GetProcAddress(hDLL, "UninstallHook");
if(UninstallHook == NULL)
{
MessageBoxA(NULL, "Fehler: UninsatllHook nicht gefunden in: mousehook.dll", "Fehler", MB_OK);
return FALSE;
}

/*Run the message loop. It will run until GetMessage() returns 0*/
while(GetMessage(&messages, NULL, 0, 0))
{
/*Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/*Send message to WindowProcedure */
DispatchMessage(&messages);
}

/* The program return-value is 0 - The value that PostQuitMessage() gave*/
FreeLibrary(hDLL);
return messages.wParam;
}

void Init()
{
InstallHook = NULL;
UninstallHook = NULL;

hInstallHookBtn = NULL;
hUninstallHookBtn = NULL;
hEditRGB = NULL;
hEditHTML = NULL;
hStaticFrame = NULL;

col = RGB(0,0,0);
ColorRect.left = 10;
ColorRect.top = 120;
ColorRect.right = 290;
ColorRect.bottom = 160;
}

void DrawDialog(HWND &parent, HINSTANCE &inst)
{
hInstallHookBtn = CreateWindowA("BUTTON", 0, WS_CHILD|WS_VISIBLE, 10, 10, 120, 30, parent, 0, inst, 0); //CreateWindowA von mir ergänzt
SetWindowTextA(hInstallHookBtn, "Install Hook"); //SetWindowTextA von mir ergänzt
hUninstallHookBtn = CreateWindowA("BUTTON", 0, WS_CHILD|WS_VISIBLE, 170, 10, 120, 30, parent, 0, inst, 0);
SetWindowTextA(hUninstallHookBtn, "Uninstall Hook");

HWND tmp;
tmp = CreateWindowA("STATIC", 0, WS_CHILD|WS_VISIBLE, 10, 60, 100, 18, parent, 0, inst, 0);
SetWindowTextA(tmp, "RGB Farbe:");
tmp = CreateWindowA("STATIC", 0, WS_CHILD|WS_VISIBLE, 10, 90, 100, 18, parent, 0, inst, 0);
SetWindowTextA(tmp, "HTML Farbe:");

hEditRGB = CreateWindowA("EDIT", 0, WS_BORDER|WS_CHILD|WS_VISIBLE|ES_READONLY, 120, 59, 100, 20, parent, 0, inst, 0);
hEditHTML = CreateWindowA("EDIT", 0, WS_BORDER|WS_CHILD|WS_VISIBLE|ES_READONLY, 120, 89, 100, 20, parent, 0, inst, 0);
//hStaticFrame = CreateWindow("STATIC", 0, WS_BORDER|WS_CHILD|WS_VISIBLE, 10, 120, 280, 40, parent, 0, inst, 0);
}

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HWND hBut;
static HBRUSH brush;

switch (message)
{
case WM_COMMAND:
if(HIWORD(wParam) == BN_CLICKED)
{
hBut = (HWND)lParam;
if(hBut == hInstallHookBtn)
{
BOOL ret = InstallHook();
if(ret == FALSE)
MessageBoxA(NULL, "InstallHook fehlgeschlagen", "Fehler", MB_OK);
else
SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE |SWP_SHOWWINDOW);
}
else if(hBut == hUninstallHookBtn)
{
if(UninstallHook() == FALSE)
MessageBoxA(NULL, "UninstallHook fehlgeschlagen", "Fehler", MB_OK);
}
}
break;

case WM_USER+123:
POINT p;
p.x = GET_X_LPARAM(lParam);
p.y = GET_Y_LPARAM(lParam);
DrawColor(p, hwnd);
break;

case WM_PAINT:
PAINTSTRUCT ps;
brush = CreateSolidBrush(col);
HDC dc;
dc = NULL;
dc = BeginPaint(hwnd, &ps);
SelectObject(dc, brush);
FillRect(dc, &ColorRect, brush);
EndPaint(hwnd, &ps);
return 0;

case WM_DESTROY:
DeleteObject(brush);
if(!UninstallHook())
MessageBoxA(NULL, "UninstallHook fehlgeschlagen", "Fehler", MB_OK);

PostQuitMessage(0);
break;

default:
return DefWindowProc (hwnd, message, wParam, lParam);
}

return 0;
}

void DrawColor(POINT &p, HWND &mainWindow)
{
HWND owner = WindowFromPoint(p);
if(owner)
{
HDC ownerDC = GetDC(owner);
if(ownerDC && !IsPointInApp(p, mainWindow))
{
ScreenToClient(owner, &p);
col = GetPixel(ownerDC, p.x, p.y);
ToHTML();
ToRGB();
InvalidateRect(mainWindow, &ColorRect, TRUE);
}
}
}

void ToHTML()
{
char sHtml[8]; sHtml[0] = 0;
sprintf(sHtml, "#%.2X%.2X%.2X", GetRValue(col), GetGValue(col), GetBValue(col));
SetWindowTextA(hEditHTML, sHtml); //SetWindowTextA von mir ergänzt
}

void ToRGB()
{
char sRGB[12]; sRGB[0] = 0;
sprintf(sRGB, "%d, %d, %d", GetRValue(col), GetGValue(col), GetBValue(col));
SetWindowTextA(hEditRGB, sRGB);
}

bool IsPointInApp(POINT &p, HWND &mainWindow)
{
RECT rect;
GetWindowRect(mainWindow, &rect);

if(p.x >= rect.left &&
p.x <= rect.right &&
p.y >= rect.top &&
p.y <= rect.bottom)
{
return true;
}
else
return false
;
}
C/C++ Code:
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
#include "main.h"

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
{
    HWND hwnd;
    MSG messages;
    WNDCLASSEX wincl;

    Init();

    /*The window structure*/

    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;
    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof (WNDCLASSEX);

    /*Use default icon and mouse-pointer*/

    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /*Register the window class, and if it fails quit the program*/

    if(!RegisterClassEx (&wincl))
        return 0;

    /*The class is registered, let's create the prgram*/

    hwnd = CreateWindowExA(
                          0,
                          szClassName,
                          "Pipette",
                          WS_SYSMENU|WS_MINIMIZEBOX,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          WINDOW_WIDTH,
                          WINDOW_HEIGHT,
                          HWND_DESKTOP,
                          NULL,
                          hThisInstance,
                          NULL
                          ); //CreateWindowA von mir ergänzt

    DrawDialog(hwnd, hThisInstance);

    /*Make the window visible on the screen*/

    ShowWindow (hwnd, nFunsterStil);

    HINSTANCE hDLL = LoadLibraryA("mousehook.dll"); //LoadLibraryA von mir ergänzt
    if(hDLL == NULL)
    {
        MessageBoxA(NULL, "Fehler beim Laden der DLL: mousehook.dll", "Fehler", MB_OK); //MessageBoxA von mir ergänzt
        return FALSE;
    }

    InstallHook = (MYFUNC) GetProcAddress(hDLL, "InstallHook");
    if(InstallHook = NULL)
    {
        MessageBoxA(NULL, "Fehler: InstallHook nicht gefunden in: mousehook.dll", "Fehler", MB_OK);
        return FALSE;
    }

    UninstallHook = (MYFUNC) GetProcAddress(hDLL, "UninstallHook");
    if(UninstallHook == NULL)
    {
        MessageBoxA(NULL, "Fehler: UninsatllHook nicht gefunden in: mousehook.dll", "Fehler", MB_OK);
        return FALSE;
    }

    /*Run the message loop. It will run until GetMessage() returns 0*/
    while(GetMessage(&messages, NULL, 0, 0))
    {
        /*Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /*Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave*/
    FreeLibrary(hDLL);
    return messages.wParam;
}

void Init()
{
    InstallHook = NULL;
    UninstallHook = NULL;

    hInstallHookBtn = NULL;
    hUninstallHookBtn = NULL;
    hEditRGB = NULL;
    hEditHTML = NULL;
    hStaticFrame = NULL;

    col = RGB(0,0,0);
    ColorRect.left = 10;
    ColorRect.top = 120;
    ColorRect.right = 290;
    ColorRect.bottom = 160;
}

void DrawDialog(HWND &parent, HINSTANCE &inst)
{
    hInstallHookBtn = CreateWindowA("BUTTON", 0, WS_CHILD|WS_VISIBLE, 10, 10, 120, 30, parent, 0, inst, 0); //CreateWindowA von mir ergänzt
    SetWindowTextA(hInstallHookBtn, "Install Hook"); //SetWindowTextA von mir ergänzt
    hUninstallHookBtn = CreateWindowA("BUTTON", 0, WS_CHILD|WS_VISIBLE, 170, 10, 120, 30, parent, 0, inst, 0);
    SetWindowTextA(hUninstallHookBtn, "Uninstall Hook");

    HWND tmp;
    tmp = CreateWindowA("STATIC", 0, WS_CHILD|WS_VISIBLE, 10, 60, 100, 18, parent, 0, inst, 0);
    SetWindowTextA(tmp, "RGB Farbe:");
    tmp = CreateWindowA("STATIC", 0, WS_CHILD|WS_VISIBLE, 10, 90, 100, 18, parent, 0, inst, 0);
    SetWindowTextA(tmp, "HTML Farbe:");

    hEditRGB = CreateWindowA("EDIT", 0, WS_BORDER|WS_CHILD|WS_VISIBLE|ES_READONLY, 120, 59, 100, 20, parent, 0, inst, 0);
    hEditHTML = CreateWindowA("EDIT", 0, WS_BORDER|WS_CHILD|WS_VISIBLE|ES_READONLY, 120, 89, 100, 20, parent, 0, inst, 0);
    //hStaticFrame = CreateWindow("STATIC", 0, WS_BORDER|WS_CHILD|WS_VISIBLE, 10, 120, 280, 40, parent, 0, inst, 0);
}

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HWND hBut;
    static HBRUSH brush;

    switch (message)
    {
    case WM_COMMAND:
        if(HIWORD(wParam) == BN_CLICKED)
        {
            hBut = (HWND)lParam;
            if(hBut == hInstallHookBtn)
            {
                BOOL ret = InstallHook();
                if(ret == FALSE)
                    MessageBoxA(NULL, "InstallHook fehlgeschlagen", "Fehler", MB_OK);
                else
                    SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE |SWP_SHOWWINDOW);
            }
            else if(hBut == hUninstallHookBtn)
            {
                if(UninstallHook() == FALSE)
                    MessageBoxA(NULL, "UninstallHook fehlgeschlagen", "Fehler", MB_OK);
            }
        }
        break;

    case WM_USER+123:
        POINT p;
        p.x = GET_X_LPARAM(lParam);
        p.y = GET_Y_LPARAM(lParam);
        DrawColor(p, hwnd);
        break;

    case WM_PAINT:
        PAINTSTRUCT ps;
        brush = CreateSolidBrush(col);
        HDC dc;
        dc = NULL;
        dc = BeginPaint(hwnd, &ps);
        SelectObject(dc, brush);
        FillRect(dc, &ColorRect, brush);
        EndPaint(hwnd, &ps);
        return 0;

    case WM_DESTROY:
        DeleteObject(brush);
        if(!UninstallHook())
            MessageBoxA(NULL, "UninstallHook fehlgeschlagen", "Fehler", MB_OK);

        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc (hwnd, message, wParam, lParam);
    }
   
    return 0;
}

void DrawColor(POINT &p, HWND &mainWindow)
{
    HWND owner = WindowFromPoint(p);
    if(owner)
    {
        HDC ownerDC = GetDC(owner);
        if(ownerDC && !IsPointInApp(p, mainWindow))
        {
            ScreenToClient(owner, &p);
            col = GetPixel(ownerDC, p.x, p.y);
            ToHTML();
            ToRGB();
            InvalidateRect(mainWindow, &ColorRect, TRUE);
        }
    }
}

void ToHTML()
{
    char sHtml[8]; sHtml[0] = 0;
    sprintf(sHtml, "#%.2X%.2X%.2X", GetRValue(col), GetGValue(col), GetBValue(col));
    SetWindowTextA(hEditHTML, sHtml); //SetWindowTextA von mir ergänzt
}

void ToRGB()
{
    char sRGB[12]; sRGB[0] = 0;
    sprintf(sRGB, "%d, %d, %d", GetRValue(col), GetGValue(col), GetBValue(col));
    SetWindowTextA(hEditRGB, sRGB);
}

bool IsPointInApp(POINT &p, HWND &mainWindow)
{
    RECT rect;
    GetWindowRect(mainWindow, &rect);

    if(p.x >= rect.left &&
        p.x <= rect.right &&
        p.y >= rect.top &&
        p.y <= rect.bottom)
    {
        return true;
    }
    else
        return false
;
}


Wenn es jetzt unter den Standardeinstellunge kompiliere erhalte ich folgdenen Fehler:
c:\...\main.cpp(17) : error C2440: '=': 'char [8]' kann nicht in 'LPCWSTR' konvertiert werden
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.

Nun habe ich allerdings im Forum gelesen, dass man in diesem Fall wohl nicht den Unicode Zeichensatz verwenden sollte.
Also habe ich die Einstellung Zeichensatz auf "Nicht festgelegt" gesetzt.
Damit konnte ich es kompilieren, allerdings mit vier Warnungen:
c:\...\main.cpp(211) : warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\programme\microsoft visual studio 9.0\vc\include\stdio.h(366): Siehe Deklaration von 'sprintf'
c:\...\main.cpp(218) : warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\programme\microsoft visual studio 9.0\vc\include\stdio.h(366): Siehe Deklaration von 'sprintf'

Wenn ich jetzt die .exe ausführe, bekomme ich, wie im Tutorial beschrieben das Fenster. Wenn ich jetzt allerdings auf "Install Hook" klicke, bekomme ich folgende Fehlermeldung:
Pipette.exe hat ein Problem festgestellt und muss beendet werden.
Falls Sie Ihre Arbeit noch nicht gespeichert hatten, können Daten möglicherweise verloren gegangen sein.
Für weitere Informationen zu diesem Fehler, [klicken Sie hier].

Wäre schön, wenn mir noch einmal jemand helfen könnte oder mir sagen könnte warum dieser Fehler zu Stande kommt ;).

P.S.: Ich benutze Visual C++ 2008 Express Edition.
hi
Unregistrierter




Beitrag hi Unregistrierter 15:50:09 15.03.2010   Titel:              Zitieren

hallo

Versuche es mal mit pilzen .)
Nein ,aber hooking ist nicht für anfänger.
In msdn ist alles beschrieben. ! Mr. Jonny
Gast123
Unregistrierter




Beitrag Gast123 Unregistrierter 20:25:19 15.03.2010   Titel:              Zitieren

hi schrieb:
Versuche es mal mit pilzen .)
Nicht lustig.

@topic: In msdn habe ich auch schon gesucht, aber nichts gefunden, was mich weiterbringt. Ich lasse mich aber gerne vom Gegenteil überzeugen ;).

Mein Probelm ist ja auch nicht mehr das Programm selber, d.h. (soweit ich es sehe) liegt es nicht mehr am Sourcecode, sondern an irgendetwas anderem. Meine Frage bezieht sich also auf die Fehlermeldung die ich bekomme, wenn ich auf "Install Hook" klicke.

Weiß jemand eine Lösung, oder könnte mir zumindest sagen, ob es jetzt ein Problem/Fehler im Sourcecode ist, oder ob der Fehler ganz woanders liegt?
0or1
Unregistrierter




Beitrag 0or1 Unregistrierter 20:40:38 15.03.2010   Titel:              Zitieren

hi

Klar liegt es an der Source !! Wen das Program abschmiert, ist meistens was in ein Speicherbereich kopiert worden der nicht gross genug ist. Also buffer/stack overflow oder formatstring etc... Schau mal was der Compiler sagt ! hast du Warnungen wen du compilierst? Mit hooks solltest du dich auskennen, da das zu schwerwiegenden Fehler im betrieb de OS kommen kann !

LB
0or1
Unregistrierter




Beitrag 0or1 Unregistrierter 20:52:43 15.03.2010   Titel:              Zitieren

Hi

So wie ich feststellen muss, gibt es immer wieder Personen die meinen sie können von einem toutorial den sourcecode übernehmen, und dan meinen es läuft alles rund. Anstat sich mit der Materie zu befassen! Dan würden auch nicht so dämliche fragen gestellt. Wer soll den das schon wissen was du für ein Problem hast. kannst nicht 300 zeilen code posten, und dan von den User hier erwarten das sie dir den Fehler suchen ! Ein bisschen eigeninitiative ist gefragt ! wen du wenigstens sagen würdest wo du den Fehler vermutest, dan wäre das etwas anderes. Und ich meine das du dich mal besser zuerst mit windows programmierung beschäftigst solltest ,anstat dich gleich mit hooks herumzuschlagen. weil so wird dir bestimmt niemand helfen.

Cya LB
Gast123
Unregistrierter




Beitrag Gast123 Unregistrierter 22:23:24 15.03.2010   Titel:              Zitieren

Hi,
@0or1: Ok, das mit den 300 Zeilen Code ist richtig; Sorry dafür.
Also, dann will ich es noch einmal versuchen (etwas kürzer):
Ich übernahm den Code aus dem Tutorial und behob einen Großteil der Fehler, bis nur noch einer übrig war (und ja, ich habe mich auch mit der Materie auseinander gesetzt):
Zitat:
c:\...\main.cpp(17) : error C2440: '=': 'char [8]' kann nicht in 'LPCWSTR' konvertiert werden
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.

Anscheinend liegt der Fehler, welcher den Programm-Absturz verursacht, hier.
Also suchte ich im Forum eine Lösung und fand diesen Thread wo geschrieben wurde:
Zitat:

windowclass.lpszClassName = szClassName;

...weist du einem Zeiger auf einen Unicodestring [wchar_t*] einen Ansi-String [char*] zu. In den Projekteinstellungen lässt sich die Unicodeunterstützung ein und ausstellen (Bei dir ist sie aktiv).
und
Zitat:
Wenn ich mich nicht irre ist das der Zeichensatz in den Projekteinstellungen (Unicode gegen ich glaube MCSB oder wie es heißt austauschen)...


Also setzte ich meinen Zeichensatz auf "Nicht festgelegt" (da ich MCSB nicht habe) und schon ließ sich das Programm (bis auf zwei Warnungen, die ich aber behob) kompilieren. Der Programm-Absturz blieb aber trotzdem.
Also vermute ich, dass der Fehler an dem oben genannten error C2440 liegt.
Meine Frage ist nun, wie ich es kovertiert bekomme, oder ob es noch eine andere Lösung gibt.
lowbyte_
Unregistrierter




Beitrag lowbyte_ Unregistrierter 22:48:41 15.03.2010   Titel:              Zitieren

hi

Nah wie wohl ?

wchar_t name={L"aaa"};

Habe gedacht du kennst dich aus. Scheinbar nicht. Also meine doch, zuerst besser c in den griff bekommen, als sich mit etwas rumzuschlagen das man noch nicht versteht !


Cya lb
lowbyte_
Unregistrierter




Beitrag lowbyte_ Unregistrierter 00:56:35 16.03.2010   Titel:              Zitieren

Hi

Um in nicht ganz durcheinander zu bringen sollte ich es noch Syntax mässig, richtig schreiben. :)


wchar_t szName[]={L"hello"};



lowbyte
Phistomefel
Unregistrierter




Beitrag Phistomefel Unregistrierter 19:52:09 16.03.2010   Titel:              Zitieren

Gast123 schrieb:
Also setzte ich meinen Zeichensatz auf "Nicht festgelegt"
...
Also vermute ich, dass der Fehler an dem oben genannten error C2440 liegt.

"Nicht festgelegt" ist richtig. Der Absturz hat eine andere Ursache, vielleicht mal debuggen ...
Gast123
Unregistrierter




Beitrag Gast123 Unregistrierter 22:12:05 17.03.2010   Titel:              Zitieren

@Phistomefel: Ich habe es jetzt mal mit Debuggen versucht; Und bei beiden Einstellungen (Zeichensatz auf Unicode bzw. "Nicht festgelegt") bekomme ich folgendes:
Zitat:
[... bla.dll geladen...]
"Pipette.exe": "C:\WINDOWS\system32\version.dll" wurde geladen
"Pipette.exe": "C:\WINDOWS\system32\version.dll" entladen.
Eine Ausnahme (erste Chance) bei 0x00000000 in Pipette.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.
Unbehandelte Ausnahme bei 0x00000000 in Pipette.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.
Das Programm "[5176] Pipette.exe: Systemeigen" wurde mit Code 0 (0x0) beendet.


Anscheinend liegt es an diesen Prozessadressen, dass das Programm abstürzt. Hat da noch jemand eine Idee, wie man es beheben kann?
Lowbyte_
Unregistrierter




Beitrag Lowbyte_ Unregistrierter 23:55:33 17.03.2010   Titel:              Zitieren

Hi


Also dem sage ich nich debuggen !!
Dll's kannst du auch nicht so einfach debuggen !
Ausser Compiler Warnungen bekommst du nichts! Das heisst wen alles Syntaktisch ok ist muss es nicht heissen dass das Programm auch einwandfrei läuft.
Wie ich schon gesagt habe (Buffer / Stack)Overflows / Formatstring bugs etc.. mal auf das schauen ! Man sollte sich schon mit Pointer etc. auskennen. Viele Probleme liegen nämlich dort. !!


lowbyte_
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13513
Beitrag Martin Richter Moderator 09:02:16 18.03.2010   Titel:              Zitieren

DLLs debuggt man genauso einfach wie jedes andere Ausführbare Programm...

_________________
Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
lowbyte_
Unregistrierter




Beitrag lowbyte_ Unregistrierter 15:09:06 18.03.2010   Titel:              Zitieren

Hi

Wie willst du eine dll debuggen ? mit dem compiler geht das nicht ! Damit du die exportierten funktionen nützen kannst, musst du ja eine korekte dll haben ! und wen du die Funktionen jetz in der main aufrufen würdes kannst du das debuggen in der dll vergessen ...ala breakpoint !


Lowbyte
lowbyte_
Unregistrierter




Beitrag lowbyte_ Unregistrierter 15:18:41 18.03.2010   Titel:              Zitieren

Hi

bei der erstellung der dll ist es natürlich was anderes !


Lowbyte_
lowbyte_
Unregistrierter




Beitrag lowbyte_ Unregistrierter 15:44:14 18.03.2010   Titel:              Zitieren

Hi

Und zu Schluss.. wen du di dll bei erstellung debuggst, kannst du nur syntax fehler erkennen und sonnst nichts. Weil du ja keine werte hast die du prüfen kannst. Also logische fehler kannst du so nicht erkennen.

Darum werden dll's anders debuggt !
Lowbyte
C/C++ Forum :: WinAPI ::  Mousehook   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.