1) Build the solution - you need Release x86 and Release x64. 2) Copy following files to any folder. They must be in the same folder. Release.x64\Run.exe Release.x64\Stop.exe Release.x64\Hook.Controller.64.exe Release.x64\Hook.64.dll Release.Win32\Hook.Controller.32.exe Release.Win32\Hook.32.dll 3) Execute "Run.exe" - that will run "Hook.Controller.64.exe" and "Hook.Controller.32.exe" in certain order - these controllers install hooks. 4) Investigate the debug messages from 32-bit and 64-bit processes. Details: Function "error()" in C++ code writes messages into file with name of the executing process + ".errors.txt" - you will see: these files will appear near the appropriate executable file. That gives possibility to distinguish what process wrote it. Hook.32/64.dll::DllMain() writes messages DLL_PROCESS_ATTACH, DLL_THREAD_ATTACH, DLL_THREAD_DETACH, DLL_PROCESS_DETACH. Hook's Keyboard_Procedure() writes messages when F6, F8, F9 are pressed. Try it, because this demonstrates strange behavior. In some cases it's correct; another cases - Keyboard_Procedure() is not called at all; another cases - these messages appear in context of "Hook.Controller.32/64.exe", not the target application. The bug: if you open 64-bit window application and press there F8 - you will not see this pressing in report of this 64-bit application, but you will see that F8 is pressed in both report files "Hook.Controller.32/64.exe.errors.txt". The bug: if you open 32-bit window application and press there F8 - you will see this pressing in appropriate report file. That behavior is correct. But, this pressing appears in "Hook.Controller.64.errors.txt" too. That is strange. There is no keyboard input for this process. 32-bit window application owns foreground window. If you will run only "Hook.Controller.64.exe" or only "Hook.Controller.32.exe" - you will see that everything is correct. I tried to run both controllers but in different order. The behavior differs: a) First 64-bit, then 32-bit: I see bug: there is no calling of Keyboard_Procedure() in target 64-bit process. Both report files of controllers register pressing of F8. b) First 32-bit, then 64-bit: target 64-bit process correctly registers F8 pressing. "Hook.Controller.32.exe" registers pressing of F8 too. "Hook.Controller.64.exe" doesn't register pressing of F8. So, the behavior depends on order of installing hooks. :) But in case b) 32-bit target process stops behave correctly. Resume: Correct behavior of hook has the bitness that is installed last. Bitness that is installed first has incorrect behavior - Keyboard_Procedure() in the context of target process is not called. 5) Execute "Stop.exe" - it sends WM_CLOSE to "Hook.Controller.64.exe" and "Hook.Controller.32.exe". P.S. Source files from "units" folder are mine. They are not allowed for distributing. They are present only because function "error()" is convinient. All other application code that is not necessary for reproducing the problem I removed.