2010-08-18 35 views
1

我已經設法使輸入鉤子工作,但現在我有點丟了把它們放到一個庫中。在DLL中調用LowLevelKeyboardProcedure

我有一個在IDE中定義的INPUTHOOK_EXPORTS的簡單頭文件,因此dll導出(Visual Studio)。

#pragma once 

#ifdef INPUTHOOK_EXPORTS 
    #define INPUTHOOK_API __declspec(dllexport) 
#else 
    #define INPUTHOOK_API __declspec(dllimport) 
#endif 

INPUTHOOK_API void InstallInputHook(); 
INPUTHOOK_API void RemoveInputHook(); 

,當然還有:

The cpp file

的事情是,當我嘗試編譯這個庫,我得到兩個無法解析的外部,一個用於SetWindowsHookExUnhookWindowsHookEx分別。爲什麼這兩個功能都不可用,而其他都是而沒有任何問題?據我所知,我確實擁有包含權利。

謝謝

回答

0

SetWindowsHookEx是一個宏,應該變成SetWindowsHookExA' for ascii or SetWindowsHookExW for wchar. Similary for UnhookWindowsHookEx`。
報告的錯誤應特定於哪個函數丟失 - A或W - 這似乎表明由於某種原因宏沒有到位。

你好像在cpp中缺少winuser.h,但是這個或者等價的可能在預編譯的stdafx.h頭文件中。

您需要在構建(鏈接)您的庫時(通常在默認包含的庫中)包含user32.lib。

0

從MSDN主題LowLevelKeyboardProc:

這個鉤子被稱爲在安裝它的線程的上下文。該調用是通過向安裝該鉤子的線程發送消息來完成的。因此,安裝該鉤子的線程必須有一個消息循環。

+0

全局鉤子('... _LL')應該在沒有它的情況下運行,因爲回調是直接調用的。這應該不是問題,因爲在將代碼移到dll之前,這個代碼很有用。 – 2010-08-18 14:28:00

+0

LowLevelKeyboardProc是WH_KEYBOARD_LL掛鉤的回調函數。你需要使用message loop.http://msdn.microsoft.com/en-us/library/ms644985%28VS.85%29.aspx但是你的問題已經改變了:現在你問一些關於未解決的外部信息。爲什麼? – 2010-08-25 15:27:39

+0

'WH_KEYBOARD_LL'不需要循環,這是我實際嘗試過的部分,它運行良好,沒有任何問題。由於某些原因,msnd表示不同,但請查看主文章下方的註釋。 |問題在於將代碼移動到庫中,由於某些原因,鉤子函數不起作用並彈出未解析的外部代碼。 – 2010-08-27 07:00:28