2012-05-16 96 views
1

我正在使用Windows Hooks製作鍵盤記錄程序。 代碼位於DLL中。鍵入的字符將被寫入文件。 然而,問題是,除了焦點在我的應用程序窗口上時,沒有字符會被記錄到文件中。 FILE *已在共享內存段中聲明。打開DLL中的共享文件

#pragma data_seg("SHARED") 
    . 
    . 
    FILE* iFile = NULL; 
    #pragma data_seg() 

如果我打開鉤函數內的文件,一切似乎都很好。

EXPORT LRESULT CALLBACK KHookProc(int nCode, WPARAM wparam, LPARAM lparam) 
    { 
        . 
        . 
        . 
     iFile = fopen("c:\\games\\log.txt","a+"); 
     fwrite((char *)(&c),1,1,iFile); 
     fclose(iFile); 

    } 
} 

如果我打開它,而設置鉤(通用於所有的進程)沒有,但我的應用程序按鍵被捕獲。

EXPORT void SetKBHook() 
{ 
if(hhook==NULL) 
{ 
    hhook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KHookProc,g_hinstance,NULL); 
    if(hhook == NULL) 
    { 
     DWORD err = GetLastError(); 
     err; 
    } 

    iFile = fopen("c:\\games\\log.txt","a+"); 
} 
} 

幫助。任何人?

回答

0

儘管指針變量可以在進程之間共享(如果您將正確的參數傳遞給鏈接器),FILE *指向的堆分配的數據結構,也不是底層的Win32文件句柄(以及相關的內核-mode文件對象)是共享的。

你最好在單個進程中打開文件句柄(啓動鍵盤記錄器),然後使用IPC機制將數據傳回到此進程,然後處理(正確同步)寫入。

這將適用於任何類型的合法鍵盤記錄目的,並且將避免很多令人頭疼的事情,試圖將文件句柄分享到您自己未啓動的進程中......更不用說同步藍調了,第一項任務。

+0

非常感謝。沒有想到那樣。 – v4g

0

而不是把文件指針在共享內存段的,我會建議鉤寫入文件的每個實例單獨使用一個名爲互斥體,以確保它們不會揍對方。如果你想獲得幻想(可能會提高性能),你可以創建一個單獨的日誌進程,從鉤子接收輸入,並且只寫入文件。

我忽略了你寫一個鍵盤記錄器,因爲這真的是越來越關於多進程掛鉤問題的臉。請不要對鍵盤記錄程序做任何瑣碎的事情。

+0

哈哈沒有惡意的目的,只是一些鬼混和鍛鍊鉤。 – v4g

相關問題