能力值:
( LV8,RANK:150 )
|
-
-
2 楼
给你我的理解啊,是这样,你的DLL已经注入到B程序,那么这个 所谓的77586会返回给B程序,你的A程序的发送代码没有给出,那我建议你这样
A:
//hWnd_A ===程序A的一个窗口句柄,hwnd_B===程序B的窗口句柄
SendMessage(hWnd_B,WM_MY_MESSAGE,(LPARAM)hWnd_A,0);//这里记得保存hwnd_A啊,下面回馈信息要用
Dll中,你的那个:
if(p->message == WM_USER+1)
{
::MessageBox(0,"成功","提示",0); return 77586;
}
替换成
if(p->message == WM_USER+1)
{
::MessageBox(0,"成功","提示",0);
::SendMessage(hwnd_A,WM_MY_MESSAGE_BACK,77586,0);
//当然这里的hwnd_A要在你发送WM_MY_MESSAGE消息的时候带过来,然后保存的适当的地方,只要这里能够访问到就好
}
//仅供参考,
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
首先谢谢楼上的这位朋友,
但是这样数据不同步额.
我之前试过自己写的程序子类化本窗口,自己处理过程,
然后在写一个主程序,发送消息就可以得到返回值,
DLL里面子类化宿主窗口没成功不知道怎么回事.
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
刚才搜索了一下论坛
貌似要Hook SendMessage必须Hook WH_CALLWNDPROC and WH_CALLWNDPROCRET
|
能力值:
( LV8,RANK:150 )
|
-
-
5 楼
自己写的窗口,还需要子类化??要是SDK不用子类化,要是MFC那就加个ON_MESSAGE(WM_MY_MESSAGE,OnMyMessage),主要是不知道你的代码,在这里乱猜测一通啊
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
在程序B中真的收到了那个消息吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
最后还是子类化搞定了
HHOOK g_hhook = NULL;
HINSTANCE m_hInst;
WNDPROC OldProc= NULL; //原窗口过程
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
BOOL APIENTRY DllMain( HANDLE hModule, //DLL入口
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
m_hInst=(HINSTANCE)hModule;
return TRUE;
};
extern "C" __declspec(dllexport) HHOOK _stdcall InstallHook(HWND hHwnd)
{
g_hhook = ::SetWindowsHookEx(WH_CALLWNDPROCRET, (HOOKPROC)KeyboardProc, m_hInst, ::GetWindowThreadProcessId(hHwnd,NULL));
if (g_hhook != NULL)
return g_hhook;
return 0;
}
extern "C" __declspec(dllexport) BOOL _stdcall UninstallHook(HHOOK hHook)
{
return ::UnhookWindowsHookEx(hHook);
}
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode == HC_ACTION)
{
//PCWPSTRUCT p=(PCWPSTRUCT)lParam;
CWPRETSTRUCT *p=(CWPRETSTRUCT*)lParam;
if(p->message == WM_USER+1)
{
HWND retNum;
char tt[10];
retNum=(HWND)p->wParam;
ltoa((DWORD)retNum,tt,10);
::MessageBox(0,tt,"提示",0);
OldProc=(WNDPROC)GetWindowLong(retNum,GWL_WNDPROC);
if (SetWindowLong(retNum,GWL_WNDPROC,(long)WindowProc)==0) //子类化
{
::MessageBox(0,"安装失败","提示",0);
}
//return 77586;
}
//::MessageBox(0,"hgggg","提示",0);
}
return ::CallNextHookEx(g_hhook, nCode, wParam ,lParam);
}
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_DESTROY://接收到销毁窗口消息时取消子类化
if (OldProc != NULL)
{
SetWindowLong(hwnd,GWL_WNDPROC,(long)OldProc);
OldProc=NULL;
}
case WM_USER + 2:
::MessageBox(0,"收到WM_USER+2消息","提示",0);
return 7758;
}
return CallWindowProc(OldProc,hwnd,uMsg,wParam,lParam);
}
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
先安装HOOK,然后发送WM_USER+1传送一个窗口句柄过去子类化,就安装成功了.
我在其他程序调用sendmessage发送WM_USER+2也能得到7758这个值了.
|