我在其他exe的窗口上创建了一个button并设置了它的wndproc
但是该wndproc总是收不到WM_COMMAND消息
请问是为什么?(C++ Win32SDK)回调函数的代码(可以被顺利调用)
LRESULT CALLBACK MyProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
SendMessage(hwndMain,message,wParam,lParam);
if (message==WM_KEYDOWN)
MessageBox(NULL, "button command","ABC",MB_OK);
return CallWindowProc((WNDPROC)buttonproc,hwndMy,message,wParam,lParam);
//switch(message)
//{
//case WM_COMMAND:
// break;
// }}创建button的代码
hwndMy=CreateWindow( "BUTTON","OK", WS_CHILD|WS_VISIBLE ,pt.x, pt.y , (pt1.x-pt.x) , (pt1.y-pt.y) ,hwndWF,(HMENU)IDB_MYBUTTON,NULL,NULL);
buttonproc=GetWindowLong(hwndMy,GWL_WNDPROC);
SetWindowLong(hwndMy,GWL_WNDPROC,(long)MyProc);
但是该wndproc总是收不到WM_COMMAND消息
请问是为什么?(C++ Win32SDK)回调函数的代码(可以被顺利调用)
LRESULT CALLBACK MyProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
SendMessage(hwndMain,message,wParam,lParam);
if (message==WM_KEYDOWN)
MessageBox(NULL, "button command","ABC",MB_OK);
return CallWindowProc((WNDPROC)buttonproc,hwndMy,message,wParam,lParam);
//switch(message)
//{
//case WM_COMMAND:
// break;
// }}创建button的代码
hwndMy=CreateWindow( "BUTTON","OK", WS_CHILD|WS_VISIBLE ,pt.x, pt.y , (pt1.x-pt.x) , (pt1.y-pt.y) ,hwndWF,(HMENU)IDB_MYBUTTON,NULL,NULL);
buttonproc=GetWindowLong(hwndMy,GWL_WNDPROC);
SetWindowLong(hwndMy,GWL_WNDPROC,(long)MyProc);
::SendMessage(m_hWnd,WM_COMMAND,MAKEWPARAM(IDOK,BN_CLICKED),0);
//my code example
#pragma data_seg(".SHARDAT")
static HHOOK callwndHook=NULL;
#pragma data_seg()
HINSTANCE hins;
callwndHook=SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)CallWndProc,hins,0);
LRESULT __declspec(dllexport)__stdcall CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
PCWPSTRUCT pcw=(PCWPSTRUCT) lParam;
if(nCode>=0 && pcw && pcw->hwnd)
{
if(pcw->message==WM_COMMAND)
{
HWND hwnd=(HWND)pcw->wParam;//you get it now ...
}
}
//my code example
#pragma data_seg(".SHARDAT")
static HHOOK callwndHook=NULL;
#pragma data_seg()
HINSTANCE hins;
callwndHook=SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)CallWndProc,hins,0);
LRESULT __declspec(dllexport)__stdcall CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
PCWPSTRUCT pcw=(PCWPSTRUCT) lParam;
if(nCode>=0 && pcw && pcw->hwnd)
{
if(pcw->message==WM_COMMAND)
{
HWND hwnd=(HWND)pcw->wParam;//you get it now ...
}
}
GetWindowLong()返回的是NULL!!!
他的进程空间不等与你的进程空间!反过来也一样,windows返回NULL是有道理的!!,你调用SetWindowLong()一定会返回NULL!!.
你看一下侯捷的win95-a-developers-guide.pdf。
可以用HWND hWnd=::FindWindow(_T(""),_T("windowname"));
得到
不是一个进程,
我现在用替换wndproc的方法搞好了
没用hook
谢谢大家
马上结贴