我用Visual Studio 2008写了一个屏幕保护程序,编译没有问题,但是在执行时发生“无法定位程序输入点ChangeWindowMessageFilter于动态链接库USER32.dll上。”错误,请有过类似经验的大侠给点帮助。
----源码如下-----
#include <windows.h>
#include "resource.h" 
#include <commctrl.h>#pragma comment(lib,"comctl32.lib")
#pragma comment(lib,"Scrnsave.lib")LRESULT WINAPI ScreenSaverProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

switch (message) 

case WM_CREATE: 
// 从注册表中获取屏幕保护程序的设置信息 
// 创建一个计时器 
// 处理其它的初始化工作 
return TRUE; 
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hDC = BeginPaint(hWnd, &ps);
SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, RGB(0x33, 0xcc, 0));
TextOut(hDC, 150, 150, "www.poroco.com.cn", 15);
EndPaint(hWnd, &ps);
break;
}
case WM_TIMER: 
// 处理绘制工作 
return TRUE; 
case WM_DESTROY: 
// 销毁计时器 
// 处理其它销毁工作 
return TRUE; 
default: 
return DefScreenSaverProc(hWnd, message, wParam, lParam); 

return FALSE; 
} BOOL WINAPI ScreenSaverConfigureDialog (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) 

switch ( message ) 

case WM_INITDIALOG: 
// 创建设置对话框并初始化各控件值 
return TRUE; 
case WM_COMMAND: 
if ( LOWORD( wParam ) == IDOK ) 

// 将用户的输入保存到注册表中 
EndDialog( hDlg, LOWORD( wParam ) ); 
return TRUE; 

else if( LOWORD( wParam ) == IDCANCEL ) 

EndDialog( hDlg, LOWORD( wParam ) ); 
return TRUE; 

break; 

return FALSE; 
} BOOL WINAPI RegisterDialogClasses(HANDLE hInst) 

// 注册特殊窗口类或自定义窗口类 
return TRUE; 
}

解决方案 »

  1.   

    同样的问题~在VC6.0能够正常,用vs2008编译出来的就不正常了。郁闷ing
      

  2.   

    ChangeWindowMessageFilter是Vista以后才有的API,你要LoadLibrary,GetProcAddr才行,编译,链接过了,只能说明你有SDK。
      

  3.   


    HINSTANCE hinstLib = LoadLibrary(_T("user32.dll"));
    if(hinstLib)
    {
    typedef BOOL (WINAPI *MYFUNC)(__in UINT,__in DWORD);
    MYFUNC fpFun = NULL;
    fpFun = (MYFUNC)GetProcAddress(hinstLib,"ChangeWindowMessageFilter");
    if(fpFun)
    {
    fpFun(WM_DROPFILES, MSGFLT_ADD);
    fpFun(WM_COPYDATA, MSGFLT_ADD);
    fpFun(0x0049, MSGFLT_ADD);
    } FreeLibrary(hinstLib);
    }
      

  4.   

    链接到正确的scrnsave.lib即可,无需5楼做法。请 检索你系统上所有的 scrnsave.lib
    在 pragma comment (lib, 中采用全路径