代码如下:
HWND winht=FindWindow(NULL,_T("test8"));
::SendMessage(winht,WM_KEYDOWN,VK_F2,0);
12 个解决方案
#1
晕了。。。我还是自己顶到上面去吧。
#2
::SendMessage(winht,WM_KEYDOWN,VK_F2,0);
改成
::PostMessage(winht, WM_KEYDOWN, VK_F2, 0);试一下。。。
改成
::PostMessage(winht, WM_KEYDOWN, VK_F2, 0);试一下。。。
#3
SendInput
不过目标程序是自己写的话,可以有别的方式,比如发注册的消息、WM_COPYDATA、通过命名管道和socket传数据等等
不过目标程序是自己写的话,可以有别的方式,比如发注册的消息、WM_COPYDATA、通过命名管道和socket传数据等等
#4
一般发送键盘消息除了WM_KEYDOWN,还得发送WM_KEYUP吧
#5
可以不带 WM_KEYUP
看首先找的句柄是否正确
另外 不知道 WM_KEYDOWN 消息怎么处理的
看首先找的句柄是否正确
另外 不知道 WM_KEYDOWN 消息怎么处理的
#6
先看下winht这个句柄有没找到
#7
句柄找到的话应该每问题
#8
看看这个啦
#9
帮顶。。。。。
#10
我确实没有检查句柄是否正确,问题是我没有办法在这里下断点,因为我的这个程序是注入到“test8”中的,这样断点心没有办法断到。
后来我发现其实是FindWindow前面加“::”成::FindWindow就可以了。
即如下。
HWND winht=::FindWindow(NULL,_T("test8"));
::SendMessage(winht,WM_KEYDOWN,VK_F2,0);
但郁闷的是。这其实不是我这个问题的主要问题。因为上面两行代码只是我不得已做的一个测试,我发现真实的情况并不是这样。
实际的情况是这样的。我用A.exe把dll.dll使用HOOK注入test8.exe,然后dll.dll模拟键盘操作test8.exe。这时候Dll发送消息用的窗口句柄是从A.exe传过来,而我好像没有办法在注入后再获得窗口句柄,因为我的窗口是使用一个类似于"任务管理器"的程序选择的,事实我并不确定是哪个窗口。
这时候我发现问题好像是DLL无法获得A.exe传过来的句柄数据。
下面我给出实际的代码。
///////////////////////////////////////////////////////////////////////////
//dll中的代码
CMainDlg *mainform;
DWORD winid;
HWND winht;
void SetHook(HWND hwnd,DWORD tid) //导出函数,在exe中调用。
{ AFX_MANAGE_STATE(AfxGetStaticModuleState());
winid=tid; //保存窗口线程ID,tid参数来自exe
winht=hwnd; //保存窗口句柄,hwnd参数来自exe
::SetWindowsHookEx(WH_KEYBOARD,&hookproc,::GetModuleHandle(_T("DllPro.dll")),tid); //设置钩子
}
LRESULT CALLBACK hookproc(int code,WPARAM wParam,LPARAM lParam) //回调函数
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
mainform=new CMainDlg;
mainform->Create(IDD_MAINDLG);}
mainform->ShowWindow(true);
return CallNextHookEx(0,code,wParam,lParam);
}
//然后我在Dll载入窗口中的一个按钮事件中写入以下代码
void CDPage1::OnBnClickedBTNAuto()
{
::SendMessage(winht,WM_KEYDOWN,VK_F1,0);
}
//////////////////////////////////////////////////////////////////////////////
我是想从SetHook(HWND hwnd,DWORD tid)的参数hwnd是不是没有传给
SendMessage(winht,WM_KEYDOWN,VK_F1,0)中的winht。这里我好像没办法调试,因为注入中的中断好像不起作用。
使用HOOK的DLl注入可以传入参数吗?
后来我发现其实是FindWindow前面加“::”成::FindWindow就可以了。
即如下。
HWND winht=::FindWindow(NULL,_T("test8"));
::SendMessage(winht,WM_KEYDOWN,VK_F2,0);
但郁闷的是。这其实不是我这个问题的主要问题。因为上面两行代码只是我不得已做的一个测试,我发现真实的情况并不是这样。
实际的情况是这样的。我用A.exe把dll.dll使用HOOK注入test8.exe,然后dll.dll模拟键盘操作test8.exe。这时候Dll发送消息用的窗口句柄是从A.exe传过来,而我好像没有办法在注入后再获得窗口句柄,因为我的窗口是使用一个类似于"任务管理器"的程序选择的,事实我并不确定是哪个窗口。
这时候我发现问题好像是DLL无法获得A.exe传过来的句柄数据。
下面我给出实际的代码。
///////////////////////////////////////////////////////////////////////////
//dll中的代码
CMainDlg *mainform;
DWORD winid;
HWND winht;
void SetHook(HWND hwnd,DWORD tid) //导出函数,在exe中调用。
{ AFX_MANAGE_STATE(AfxGetStaticModuleState());
winid=tid; //保存窗口线程ID,tid参数来自exe
winht=hwnd; //保存窗口句柄,hwnd参数来自exe
::SetWindowsHookEx(WH_KEYBOARD,&hookproc,::GetModuleHandle(_T("DllPro.dll")),tid); //设置钩子
}
LRESULT CALLBACK hookproc(int code,WPARAM wParam,LPARAM lParam) //回调函数
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
mainform=new CMainDlg;
mainform->Create(IDD_MAINDLG);}
mainform->ShowWindow(true);
return CallNextHookEx(0,code,wParam,lParam);
}
//然后我在Dll载入窗口中的一个按钮事件中写入以下代码
void CDPage1::OnBnClickedBTNAuto()
{
::SendMessage(winht,WM_KEYDOWN,VK_F1,0);
}
//////////////////////////////////////////////////////////////////////////////
我是想从SetHook(HWND hwnd,DWORD tid)的参数hwnd是不是没有传给
SendMessage(winht,WM_KEYDOWN,VK_F1,0)中的winht。这里我好像没办法调试,因为注入中的中断好像不起作用。
使用HOOK的DLl注入可以传入参数吗?
#11
这是否应该另外提交成一个问题?
#12
#1
晕了。。。我还是自己顶到上面去吧。
#2
::SendMessage(winht,WM_KEYDOWN,VK_F2,0);
改成
::PostMessage(winht, WM_KEYDOWN, VK_F2, 0);试一下。。。
改成
::PostMessage(winht, WM_KEYDOWN, VK_F2, 0);试一下。。。
#3
SendInput
不过目标程序是自己写的话,可以有别的方式,比如发注册的消息、WM_COPYDATA、通过命名管道和socket传数据等等
不过目标程序是自己写的话,可以有别的方式,比如发注册的消息、WM_COPYDATA、通过命名管道和socket传数据等等
#4
一般发送键盘消息除了WM_KEYDOWN,还得发送WM_KEYUP吧
#5
可以不带 WM_KEYUP
看首先找的句柄是否正确
另外 不知道 WM_KEYDOWN 消息怎么处理的
看首先找的句柄是否正确
另外 不知道 WM_KEYDOWN 消息怎么处理的
#6
先看下winht这个句柄有没找到
#7
句柄找到的话应该每问题
#8
看看这个啦
#9
帮顶。。。。。
#10
我确实没有检查句柄是否正确,问题是我没有办法在这里下断点,因为我的这个程序是注入到“test8”中的,这样断点心没有办法断到。
后来我发现其实是FindWindow前面加“::”成::FindWindow就可以了。
即如下。
HWND winht=::FindWindow(NULL,_T("test8"));
::SendMessage(winht,WM_KEYDOWN,VK_F2,0);
但郁闷的是。这其实不是我这个问题的主要问题。因为上面两行代码只是我不得已做的一个测试,我发现真实的情况并不是这样。
实际的情况是这样的。我用A.exe把dll.dll使用HOOK注入test8.exe,然后dll.dll模拟键盘操作test8.exe。这时候Dll发送消息用的窗口句柄是从A.exe传过来,而我好像没有办法在注入后再获得窗口句柄,因为我的窗口是使用一个类似于"任务管理器"的程序选择的,事实我并不确定是哪个窗口。
这时候我发现问题好像是DLL无法获得A.exe传过来的句柄数据。
下面我给出实际的代码。
///////////////////////////////////////////////////////////////////////////
//dll中的代码
CMainDlg *mainform;
DWORD winid;
HWND winht;
void SetHook(HWND hwnd,DWORD tid) //导出函数,在exe中调用。
{ AFX_MANAGE_STATE(AfxGetStaticModuleState());
winid=tid; //保存窗口线程ID,tid参数来自exe
winht=hwnd; //保存窗口句柄,hwnd参数来自exe
::SetWindowsHookEx(WH_KEYBOARD,&hookproc,::GetModuleHandle(_T("DllPro.dll")),tid); //设置钩子
}
LRESULT CALLBACK hookproc(int code,WPARAM wParam,LPARAM lParam) //回调函数
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
mainform=new CMainDlg;
mainform->Create(IDD_MAINDLG);}
mainform->ShowWindow(true);
return CallNextHookEx(0,code,wParam,lParam);
}
//然后我在Dll载入窗口中的一个按钮事件中写入以下代码
void CDPage1::OnBnClickedBTNAuto()
{
::SendMessage(winht,WM_KEYDOWN,VK_F1,0);
}
//////////////////////////////////////////////////////////////////////////////
我是想从SetHook(HWND hwnd,DWORD tid)的参数hwnd是不是没有传给
SendMessage(winht,WM_KEYDOWN,VK_F1,0)中的winht。这里我好像没办法调试,因为注入中的中断好像不起作用。
使用HOOK的DLl注入可以传入参数吗?
后来我发现其实是FindWindow前面加“::”成::FindWindow就可以了。
即如下。
HWND winht=::FindWindow(NULL,_T("test8"));
::SendMessage(winht,WM_KEYDOWN,VK_F2,0);
但郁闷的是。这其实不是我这个问题的主要问题。因为上面两行代码只是我不得已做的一个测试,我发现真实的情况并不是这样。
实际的情况是这样的。我用A.exe把dll.dll使用HOOK注入test8.exe,然后dll.dll模拟键盘操作test8.exe。这时候Dll发送消息用的窗口句柄是从A.exe传过来,而我好像没有办法在注入后再获得窗口句柄,因为我的窗口是使用一个类似于"任务管理器"的程序选择的,事实我并不确定是哪个窗口。
这时候我发现问题好像是DLL无法获得A.exe传过来的句柄数据。
下面我给出实际的代码。
///////////////////////////////////////////////////////////////////////////
//dll中的代码
CMainDlg *mainform;
DWORD winid;
HWND winht;
void SetHook(HWND hwnd,DWORD tid) //导出函数,在exe中调用。
{ AFX_MANAGE_STATE(AfxGetStaticModuleState());
winid=tid; //保存窗口线程ID,tid参数来自exe
winht=hwnd; //保存窗口句柄,hwnd参数来自exe
::SetWindowsHookEx(WH_KEYBOARD,&hookproc,::GetModuleHandle(_T("DllPro.dll")),tid); //设置钩子
}
LRESULT CALLBACK hookproc(int code,WPARAM wParam,LPARAM lParam) //回调函数
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
mainform=new CMainDlg;
mainform->Create(IDD_MAINDLG);}
mainform->ShowWindow(true);
return CallNextHookEx(0,code,wParam,lParam);
}
//然后我在Dll载入窗口中的一个按钮事件中写入以下代码
void CDPage1::OnBnClickedBTNAuto()
{
::SendMessage(winht,WM_KEYDOWN,VK_F1,0);
}
//////////////////////////////////////////////////////////////////////////////
我是想从SetHook(HWND hwnd,DWORD tid)的参数hwnd是不是没有传给
SendMessage(winht,WM_KEYDOWN,VK_F1,0)中的winht。这里我好像没办法调试,因为注入中的中断好像不起作用。
使用HOOK的DLl注入可以传入参数吗?
#11
这是否应该另外提交成一个问题?