मैंने इंटरनेट पर मिले स्रोत कोड का उपयोग करके एक ग्लोबल कीबोर्ड हुक डीएलएल बनाया है। सर्वोत्तम भाग के लिए यह शानदार काम करता है, सिवाय इसके कि जब ब्राउज़र की बात आती है।विंडोज ग्लोबल कीबोर्ड हुक - डेल्फी
यह ब्राउजर में हर कुंजी उठाता है, ऐसा लगता है, जब ब्राउज़र फोकस हो जाता है, तो यह दबाए जाने वाली पहली कुंजी खो देता है। आईई और फ़ायरफ़ॉक्स में इसका परीक्षण किया और यह दोनों के लिए समान लगता है।
उदाहरण के लिए, यदि मैं आईई खोलता हूं और 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;
आपके कोड का एक नमूना आपके कोड का उत्तर देने की कोशिश करने वाले लोगों के लिए बहुत मदद करता है। –
हां, मुझे पता है, समस्या यह है कि मुझे पूरी परियोजना को रखना होगा क्योंकि मुझे नहीं पता कि समस्या कहां हो सकती है। मैं क्या कह सकता हूं कि मैं हुक सेट करने के लिए फॉलो का उपयोग करता हूं: hKeyHook: = SetWindowsHookEx (WH_KEYBOARD, KeyHookFunc, hInstance, 0); लेकिन मैंने एक सी # प्रोजेक्ट देखा है जो WH_KEYBOARD_LL का उपयोग करने लगता है, क्या इससे कोई फर्क पड़ सकता है? – Paul
कम से कम आप हमें उस स्रोत को दिखा सकते हैं जो आपने इंटरनेट पर पाया है। शायद यह कोड सही नहीं है ... – bepe4711