我要控制最外层的主窗口处理函数,写了下面的dll以下是一个Win32 Dynamic-Link Library,只有2个文件
//----Dll.h---
//更改hWnd的处理函数
extern "C" BOOL __declspec(dllexport) __stdcall InitWndProc(HWND hWnd);
//还原处理函数
extern "C" void __declspec(dllexport) __stdcall UninitWndProc();//----Dll.cpp---
#include <windows.h>
#include "Dll.h"
HWND g_hWnd = NULL; //最外层主窗口句柄
LONG g_WndProcOld = 0; //保存g_hWnd老的窗口处理函数//什么也不做
BOOL APIENTRY DllMain(HANDLE, DWORD, LPVOID)
{
return TRUE;
}//新的处理函数
LRESULT WINAPI WndProcNew(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
return CallWindowProc((WNDPROC)g_WndProcOld, hWnd, uMsg, wParam, lParam);
}BOOL __stdcall InitWndProc(HWND hWnd)
{
//获得hWnd的最外层父窗口,并赋给g_hWnd
HWND hParentWnd = hWnd;
g_hWnd = hWnd;
while ( hParentWnd )
{
hParentWnd = GetParent(hParentWnd);
if ( hParentWnd )
g_hWnd = hParentWnd;
}
//将g_hWnd的处理函数换成WndProcNew
if ( g_WndProcOld == 0 && g_hWnd )
{
g_WndProcOld = SetWindowLong(g_hWnd, GWL_WNDPROC,(LONG)WndProcNew);
return TRUE;
}
return FALSE;
}void __stdcall UninitWndProc()
{
if ( g_WndProcOld && g_hWnd )
{
//还原
SetWindowLong(g_hWnd, GWL_WNDPROC, g_WndProcOld);
g_WndProcOld = 0;
}
}/////////////////////////////////////////////////////////////////////
就是这么几行代码,之后在窗口的OnCreate和OnDestroy中分别调用
在单文档中使用没问题
但在MFC ActiveX Control中就会出现Unhandled exception in TSTCON32.EXE :
0xC0000005 : Access Violation
为什么会出现这个错误呢,请各位高手指点。。不要嫌分少啊,小弟只有这些了
//----Dll.h---
//更改hWnd的处理函数
extern "C" BOOL __declspec(dllexport) __stdcall InitWndProc(HWND hWnd);
//还原处理函数
extern "C" void __declspec(dllexport) __stdcall UninitWndProc();//----Dll.cpp---
#include <windows.h>
#include "Dll.h"
HWND g_hWnd = NULL; //最外层主窗口句柄
LONG g_WndProcOld = 0; //保存g_hWnd老的窗口处理函数//什么也不做
BOOL APIENTRY DllMain(HANDLE, DWORD, LPVOID)
{
return TRUE;
}//新的处理函数
LRESULT WINAPI WndProcNew(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
return CallWindowProc((WNDPROC)g_WndProcOld, hWnd, uMsg, wParam, lParam);
}BOOL __stdcall InitWndProc(HWND hWnd)
{
//获得hWnd的最外层父窗口,并赋给g_hWnd
HWND hParentWnd = hWnd;
g_hWnd = hWnd;
while ( hParentWnd )
{
hParentWnd = GetParent(hParentWnd);
if ( hParentWnd )
g_hWnd = hParentWnd;
}
//将g_hWnd的处理函数换成WndProcNew
if ( g_WndProcOld == 0 && g_hWnd )
{
g_WndProcOld = SetWindowLong(g_hWnd, GWL_WNDPROC,(LONG)WndProcNew);
return TRUE;
}
return FALSE;
}void __stdcall UninitWndProc()
{
if ( g_WndProcOld && g_hWnd )
{
//还原
SetWindowLong(g_hWnd, GWL_WNDPROC, g_WndProcOld);
g_WndProcOld = 0;
}
}/////////////////////////////////////////////////////////////////////
就是这么几行代码,之后在窗口的OnCreate和OnDestroy中分别调用
在单文档中使用没问题
但在MFC ActiveX Control中就会出现Unhandled exception in TSTCON32.EXE :
0xC0000005 : Access Violation
为什么会出现这个错误呢,请各位高手指点。。不要嫌分少啊,小弟只有这些了
解决方案 »
- VC串口数据接收后的处理(保存与比较大小)
- 在OnSize中用MoveWindow设置CDateTimeCtrl的窗口大小,每设置一次窗口的长宽会各缩小4个点,请问是什么原因呢?
- 关于界面设计
- 怎么样实时的读取串口发过的数据?是用消息?还是其他的什么?
- 寻求visual studio 97 开发工具,有的话,给我个地址,谢谢!
- 哪位高手能详细解释一下回调及回调函数
- 數組問題,,裡面的程序錯在何處??
- 急、急、急。关于编译器的问题。。。
- 为什么TreeCtrl在InsertItem()老是出错?
- 一段VC程序挑错 编译时不出错 但当生成exe文件 运行到这一段时提示基础类应用程序停止运行
- 大家近来聊聊阿,说说自己的认识!
- 根据一个窗口的句柄,怎样得到它的Rigion,急!!
捐赠成功!
由于最外面的窗口是别人创建的,如果自己创建的就用不着写这个dll了
我要处理的是待机和休眠事件(WM_POWERBROADCAST),但这个事件好像只能在外层窗口中使用,哪位有在子窗口处理的代码吗