简单来说,就是我模拟键盘消息,当按下字母Q的时候。,我发送从配置文件读取的字符串,但是出问题了,只能在edit上有效果,在TXT等上面无效果,但是直接发送常量却可以,求高人指点
void SetInfoMsg(LPCTSTR cInfo, HWND hWnd)
{
const char* cTemp = cInfo;
while(*cTemp != '\0')
{
SendMessage(hWnd, WM_CHAR, 'a', NULL);//这个a可以被模拟出来
SendMessage(hWnd, WM_CHAR, *cTemp++, NULL);//这样的却不行
}
}void TriggerMsg(CString& strMSg)
{
HWND hWnd;
hWnd = GetForegroundWindow();
DWORD FormThreadID = GetCurrentThreadId();
DWORD CWndThreadID = GetWindowThreadProcessId(hWnd, NULL);
AttachThreadInput(CWndThreadID, FormThreadID, true); hWnd = GetFocus(); // 得到当前键盘光标所在的窗口
AttachThreadInput(CWndThreadID, FormThreadID, false); // 取消 SetInfoMsg(strMSg, hWnd);}
void SetInfoMsg(LPCTSTR cInfo, HWND hWnd)
{
const char* cTemp = cInfo;
while(*cTemp != '\0')
{
SendMessage(hWnd, WM_CHAR, 'a', NULL);//这个a可以被模拟出来
SendMessage(hWnd, WM_CHAR, *cTemp++, NULL);//这样的却不行
}
}void TriggerMsg(CString& strMSg)
{
HWND hWnd;
hWnd = GetForegroundWindow();
DWORD FormThreadID = GetCurrentThreadId();
DWORD CWndThreadID = GetWindowThreadProcessId(hWnd, NULL);
AttachThreadInput(CWndThreadID, FormThreadID, true); hWnd = GetFocus(); // 得到当前键盘光标所在的窗口
AttachThreadInput(CWndThreadID, FormThreadID, false); // 取消 SetInfoMsg(strMSg, hWnd);}
void SetInfoMsg(LPCTSTR cInfo, HWND hWnd)
{
const char* cTemp = cInfo;
while(*cTemp != '\0')
{
SendMessage(hWnd, WM_CHAR, 'a', NULL);//这个a可以被模拟出来
SendMessage(hWnd, WM_CHAR, *cTemp++, NULL);//这样的却不行
}
}void CDlgDemoDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CWnd* pWnd = GetDlgItem(IDC_EDIT_CODE);
SetInfoMsg("123",pWnd->m_hWnd);
}
楼主,我这样去试你的代码,框里可以成功地出现 a1a2a3 的,也就是你的代码应该是对的.
======
你这里传进去的是CString吧,而你在SetInfoMsg中定义的参数是LPCTSTR,将strMsg改成一个char数组试试。
对于参数类型来说 TCHAR[] 与 LPCTSTR 是一样的.
相当于在ASCII 环境中的 char[] char* 是一样的
我现在去尝试让 HookTest去读配置文件,从而去传给dll,但是我很疑惑的是 为什么当前进程是HookTest,才显示读取的正确的配置文件的信息,如果不是,则无法显示
=========
很简单,全局钩子被注入到别的进程中之后,这个DLL就是别的进程中的一部分,它使用被注入的进程的内存空间,你的HookTest读出来的信息根本传入的DLL是HookTest加载的DLL,而不是被注入到别的进程中去的DLL。DLL并不共享数据区。
那个地址,在对方进程不知道是什么数据.但也是有办法可以实现跨进程传指针,我之前也试过代码是可以的.1 VirtualAllocEx 在对方进程先分配空间
2 WriteProcessMemory 把要处理的字符串写入对方进程的地址空间
3 发消息传参时,写上刚才在对方进程分配并写入的地址
4 处理完后,VirtualFreeEx 刚才分配的空间
那个地址,在对方进程不知道是什么数据.但也是有办法可以实现跨进程传指针,我之前也试过代码是可以的.1 VirtualAllocEx 在对方进程先分配空间
2 WriteProcessMemory 把要处理的字符串写入对方进程的地址空间
3 发消息传参时,写上刚才在对方进程分配并写入的地址
4 处理完后,VirtualFreeEx 刚才分配的空间
HWND g_hWnd = NULL;
#pragma data_seg()
g_hWnd 是调用的那个程序的句柄,可惜如果我在里面+字符串什么的,来接收程序发送过来的数据,可惜没用明天结贴
另外如果有高人在的话,问下 模拟键盘输入,我手写可以,为什么比如一些网站自己写的输入控件,应该是封装了,请教下,这样的该怎么弄,貌似我模拟它不承认
keybd_event(VK_DECIMAL, 0, 0, 0);
keybd_event(VK_DECIMAL, 0, KEYEVENTF_KEYUP, 0);
DLL共享变量是可以的,最好定义成char数组,而且必须要初始化。