an hook'er
-
hi al zsamn,
folgender code funzt sehr gut, aber nur dann wenn mein progarmm activ ist..... an sonsten (inactiv) bekommt mein fenster keine nachricht "WM_MY".....!
Ist das normal? oder habe ich was wergessen...zur erklaerung:
die dll.dll soll alle WM_KEYDOWN und WM_KEYUP nachrichten abfangen und sie an mein programm senden.../////////////////////////////////////////// // exe.cpp #include "dll.h" #define WM_MY (WM_USER + 1) LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ switch (message){ case WM_CREATE : // dll-funkition aufrufen und HANDLE auf mein programm uebergeben SetupHook (hwnd) ; return 0 ; case WM_MY : MessageBox (NULL, "Angekommen", "Nachricht", NULL) ; return 0 ; case WM_DESTROY : UninstallHook () ; PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; } //////////////////////////////////////////// //dll.h #ifdef __cplusplus #define EXPORT extern "C" __declspec (dllexport) #else #define EXPORT __declspec (dllexport) #endif EXPORT BOOL CALLBACK SetupHook (HWND) ; EXPORT BOOL CALLBACK UninstallHook (void) ; ///////////////////////////////////////////// // dll.cpp #include <windows.h> #include "dll.h" #define WM_MYWM (WM_USER + 1) LRESULT CALLBACK KeyboardHookProc (int, WPARAM, LPARAM) ; HINSTANCE hDllInstance ; HHOOK hhkHook ; HWND hParentWindow ; int APIENTRY DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved){ hDllInstance = hInstance ; return TRUE ; } // Diese funktion wird von meinem programm aus (exe.cpp) aufgerufen // Epfangene Parameter HANDLE auf mein fenster (exe.cpp) EXPORT BOOL CALLBACK SetupHook (HWND hWindow){ // Hook auf die Tastatur setzen hhkHook = SetWindowsHookEx (WH_KEYBOARD, KeyboardHookProc, hDllInstance, NULL) ; hParentWindow = hWindow ; return TRUE ; } // Tastatur auf diese funktion verbogen LRESULT CALLBACK KeyboardHookProc (int nCode, WPARAM wParam, LPARAM lParam){ int iVK_USER ; // F1 bis F12 abfangen switch (wParam){ case VK_F1 : iVK_USER = VK_F1 ; break ; case VK_F2 : iVK_USER = VK_F2 ; break ; case VK_F3 : iVK_USER = VK_F3 ; break ; case VK_F4 : iVK_USER = VK_F4 ; break ; case VK_F5 : iVK_USER = VK_F5 ; break ; case VK_F6 : iVK_USER = VK_F6 ; break ; case VK_F7 : iVK_USER = VK_F7 ; break ; case VK_F8 : iVK_USER = VK_F8 ; break ; case VK_F9 : iVK_USER = VK_F9 ; break ; case VK_F10 : iVK_USER = VK_F10 ; break ; case VK_F11 : iVK_USER = VK_F11 ; break ; case VK_F12 : iVK_USER = VK_F12 ; break ; default : iVK_USER = 0 ; break ; } if (iVK_USER != 0){ // Nachricht an mein programm (exe.cpp) senden SendMessage (hParentWindow, (UINT) WM_MYWM, (WPARAM) iVK_USER, (LPARAM) 1) ; } return CallNextHookEx (hhkHook, nCode, wParam, lParam) ; } // Hook deinstallieren EXPORT BOOL CALLBACK UninstallHook (void){ UnhookWindowsHookEx (hhkHook) ; return TRUE ; }
ich hoffe der code ist lesbar und verstaendlich geschrieben.
fuer jede hilfe bin ich dankbar...thx
mfg
toom
-
hat sich erledigt.
es lag an der gemeinsamen nutzung der Datensegmente...
-
winuser.h:
#define VK_F1 0x70 #define VK_F2 0x71 #define VK_F3 0x72 #define VK_F4 0x73 #define VK_F5 0x74 #define VK_F6 0x75 #define VK_F7 0x76 #define VK_F8 0x77 #define VK_F9 0x78 #define VK_F10 0x79 #define VK_F11 0x7A #define VK_F12 0x7B #define VK_F13 0x7C #define VK_F14 0x7D #define VK_F15 0x7E #define VK_F16 0x7F #define VK_F17 0x80 #define VK_F18 0x81 #define VK_F19 0x82 #define VK_F20 0x83 #define VK_F21 0x84 #define VK_F22 0x85 #define VK_F23 0x86 #define VK_F24 0x87
Warum machst du das sooo kompliziert???
cu para
:o
-
?
-
Na du könntest es doch so machen:
if(wParam>=0x70 && wParam<=0x87) iVK_USER = wParam; else iVK_USER = 0;
cu para
[ Dieser Beitrag wurde am 08.01.2003 um 18:27 Uhr von paranoiac.org editiert. ]
-
logisch.... aber noch besser ist:::
if ((wParam >= VK_F1) && (wParam <=VK_F12)) SendMessage (hParentWindow, (UINT) WM_KEYDOWN, (WPARAM) wParam, (LPARAM) lParam) ;
kuerzer geht's nicht...
amen