2010-07-01 29 views
6

मैंने इंटरनेट पर मिले स्रोत कोड का उपयोग करके एक ग्लोबल कीबोर्ड हुक डीएलएल बनाया है। सर्वोत्तम भाग के लिए यह शानदार काम करता है, सिवाय इसके कि जब ब्राउज़र की बात आती है।विंडोज ग्लोबल कीबोर्ड हुक - डेल्फी

यह ब्राउजर में हर कुंजी उठाता है, ऐसा लगता है, जब ब्राउज़र फोकस हो जाता है, तो यह दबाए जाने वाली पहली कुंजी खो देता है। आईई और फ़ायरफ़ॉक्स में इसका परीक्षण किया और यह दोनों के लिए समान लगता है।

उदाहरण के लिए, यदि मैं आईई खोलता हूं और www टाइप करना शुरू करता हूं। , मैं केवल वापस ww मिलता है। यदि ब्राउज़र विंडो फोकस में रहती है तो कोई और कुंजी गुम हो जाती है। जैसे ही ब्राउज़र फोकस खो देता है और फोकस वापस लेता है, पहली कुंजी फिर से गायब हो जाती है।

क्या यह WH_KEYPRESS/WH_KEYUP के बजाय केवल WH_KEYDOWN का उपयोग करने के कारण हो सकता है? क्या कोई इस पर कुछ प्रकाश डाल सकता है?

धन्यवाद

पुनश्च: हुक समारोह में ही नीचे है: DLL एक ज्ञापन बॉक्स और एप्लिकेशन संभाल भेज दिया जाता है DLL जो करने के लिए संदेश के साथ ही एक usermessage भेज देंगे।

function KeyHookFunc(Code, VirtualKey, KeyStroke: Integer): LRESULT; stdcall; 
var 
    KeyState1: TKeyBoardState; 
    AryChar: array[0..1] of Char; 
    Count: Integer; 
begin 
    Result := 0; 
    if Code = HC_NOREMOVE then Exit; 

    Result := CallNextHookEx(hKeyHook, Code, VirtualKey, KeyStroke); 
    {I moved the CallNextHookEx up here but if you want to block 
    or change any keys then move it back down} 
    if Code < 0 then 
    Exit; 
    if Code = HC_ACTION then 
    begin 
    if ((KeyStroke and (1 shl 30)) <> 0) then 
     if not IsWindow(hMemo) then 
     begin 
     {I moved the OpenFileMapping up here so it would not be opened 
     unless the app the DLL is attatched to gets some Key messages} 
     hMemFile := OpenFileMapping(FILE_MAP_WRITE, False, 'NetParentMAP');//Global7v9k 
     PHookRec1 := MapViewOfFile(hMemFile, FILE_MAP_WRITE, 0, 0, 0); 
     if PHookRec1 <> nil then 
     begin 
      hMemo := PHookRec1.MemoHnd; 
      hApp := PHookRec1.AppHnd; 
     end; 
     end; 
    if ((KeyStroke AND (1 shl 31)) = 0) then //if ((KeyStroke and (1 shl 30)) <> 0) then 
    begin 
     GetKeyboardState(KeyState1); 
     Count := ToAscii(VirtualKey, KeyStroke, KeyState1, AryChar, 0); 
     if Count = 1 then 
     begin 
     SendMessage(hMemo, WM_CHAR, Ord(AryChar[0]), 0); 
     {I included 2 ways to get the Charaters, a Memo Hnadle and 
     a WM_USER+1678 message to the program} 
     PostMessage(hApp, WM_USER + 1678, Ord(AryChar[0]), 0); 
     end; 
    end; 
    end; 
end; 
+2

आपके कोड का एक नमूना आपके कोड का उत्तर देने की कोशिश करने वाले लोगों के लिए बहुत मदद करता है। –

+0

हां, मुझे पता है, समस्या यह है कि मुझे पूरी परियोजना को रखना होगा क्योंकि मुझे नहीं पता कि समस्या कहां हो सकती है। मैं क्या कह सकता हूं कि मैं हुक सेट करने के लिए फॉलो का उपयोग करता हूं: hKeyHook: = SetWindowsHookEx (WH_KEYBOARD, KeyHookFunc, hInstance, 0); लेकिन मैंने एक सी # प्रोजेक्ट देखा है जो WH_KEYBOARD_LL का उपयोग करने लगता है, क्या इससे कोई फर्क पड़ सकता है? – Paul

+0

कम से कम आप हमें उस स्रोत को दिखा सकते हैं जो आपने इंटरनेट पर पाया है। शायद यह कोड सही नहीं है ... – bepe4711

उत्तर

8

आप काफी पहले अपने hMemo और hApp मान निर्दिष्ट नहीं कर रहे हैं। आप 1 के "पिछले राज्य" ध्वज के साथ अधिसूचना तक प्रतीक्षा कर रहे हैं, जो इंगित करता है कि कम से कम 1 दोहराव गिनती के लिए एक कुंजी दबा दी गई है, या जारी किया जा रहा है, जो भी पहले होता है। इस प्रकार, hMemo और hApp तब तक उपलब्ध नहीं हैं जब आपका हुक अपनी पहली कुंजी डाउन अधिसूचना का पता लगाता है। यही कारण है कि आप पात्रों को याद करते हैं। इसके बजाय इसे आजमाएं:

function KeyHookFunc(Code, VirtualKey, KeyStroke: Integer): LRESULT; stdcall; 
var 
    KeyState1: TKeyBoardState; 
    AryChar: array[0..1] of Char; 
    Count: Integer; 
begin 
    Result := CallNextHookEx(hKeyHook, Code, VirtualKey, KeyStroke); 
    if Code <> HC_ACTION then Exit; 

    { a key notification had occured, prepare the HWNDs 
    before checking the actual key state } 
    if (hMemo = 0) or (hApp = 0) then 
    begin 
    if hMemFile = 0 then 
    begin 
     hMemFile := OpenFileMapping(FILE_MAP_WRITE, False, 'NetParentMAP'); 
     if hMemFile = 0 then Exit; 
    end; 
    if PHookRec1 = nil then 
    begin 
     PHookRec1 := MapViewOfFile(hMemFile, FILE_MAP_WRITE, 0, 0, 0); 
     if PHookRec1 = nil then Exit; 
    end; 
    hMemo := PHookRec1.MemoHnd; 
    hApp := PHookRec1.AppHnd; 
    if (hMemo = 0) and (hApp = 0) then Exit; 
    end; 

    if ((KeyStroke and (1 shl 31)) = 0) then // a key is down 
    begin 
    GetKeyboardState(KeyState1); 
    Count := ToAscii(VirtualKey, KeyStroke, KeyState1, AryChar, 0); 
    if Count = 1 then 
    begin 
     if hMemo <> 0 then SendMessage(hMemo, WM_CHAR, Ord(AryChar[0]), 0); 
     if hApp <> 0 then PostMessage(hApp, WM_USER + 1678, Ord(AryChar[0]), 0); 
    end; 
    end; 
end; 
+3

दोस्त आप एक स्टार हैं। शायद बेवकूफ गलती, लेकिन कम नहीं। धन्यवाद – Paul