在设置前应该先GETCURSOR保存旧光标,再设置回来

解决方案 »

  1.   

    又这方面的代码不?发给我嘛谢谢;了幽香  [email protected]
      

  2.   

    函数功能:该函数使一个应用程序定制系统光标。它用hcur规定的光标内容代替id定义的系统光标内容,接着销毁hour。     函数原型:BOOL SetSystemCursor(HCURSOR hour,DWORD id);     参数:     hcur:光标的句柄,该函数hcur标识的光标的内容代替id定义的系统光标内容。系统通过调用DestroyCursor函数销毁hour。因此hour不能是由LoadCursor函数载入的光标。要指定一个从资源载入的光标,先用CopyCursor函数复制该光标,然后把该副本传送给SetSystemCursor函数。     Id:指定由hour的内容替换系统光标。     下面是一系列的系统光标标识符:     OCR_APPSTARTING:标准箭头和小的沙漏;OCR_NORAAC:标准箭头     OCR_CROSS:交叉十字线光标:OCR_HAND:手的形状(WindowsNT5.0和以后版本)     OCR_HELP:箭头和向东标记;OCR_IBEAM:I形梁;OCR_NO:斜的圆     OCR_SIZEALL:四个方位的箭头分别指向北、南、东、西     OCR_SIZENESEW:双箭头分别指向东北和西南;OCR_SIZENS:双箭头,分别指向北和南     OCR_SIZENWSE:双箭头分别指向西北和东南;OCR_SIZEWE:双箭头分别指向西和东     OCR_UP:垂直箭头:OCR_WAIT:沙漏返回值:如果成功,返回非零值;如果失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。     速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:不支持;头文件:winuser.h;库文件:user32.lib。
      

  3.   

    HCURSOR holdcur=::LoadCursor(NULL,MAKEINTRESOURCE(OCR_NORMAL));
    SetSystemCursor(::LoadCursor(NULL,MAKEINTRESOURCE(IDC_MYCURSOR)),OCR_NORMAL);//替换
    SetSystemCursor(holdcur,OCR_NORMAL);//还原试试看
      

  4.   

    兄弟我试过了你说的方法了,可以替换 但是改 不回来 ,我替换 了想再改回来啊 
    HCURSOR holdcur=::LoadCursor(NULL,MAKEINTRESOURCE(OCR_NORMAL));
    SetSystemCursor(::LoadCursor(hInst,MAKEINTRESOURCE(IDC_MYCURSOR)),OCR_NORMAL);//替换
    SetSystemCursor(holdcur,OCR_NORMAL);////还原的时候SetSystemCursor(holdcur,OCR_NORMAL)的第2个参数怎么设置,用IDC_MYCURSOR也不行
      

  5.   

    因此hour不能是由LoadCursor函数载入的光标。要指定一个从资源载入的光标,先用CopyCursor函数复制该光标,然后把该副本传送给SetSystemCursor函数。
    SetSystemCursor(::LoadCursor(hInst,MAKEINTRESOURCE(IDC_MYCURSOR)),OCR_NORMAL)
    这个函数你调用成功了?我刚测试的时候都是返回0
      

  6.   

    搜索了下,有人说WINDOWS NT下好象无法还原
      

  7.   

    可以用SystemParametersInfo来还原:
    SystemParametersInfo(SPI_SETCURSORS, 0, NULL, 0);
      

  8.   

    楼上的多谢了呀!!!在我绝望的时候帮了我一把,但是我想做一个程序,当我的程序运行的时候,不管鼠标移动到桌面上任何窗口上,或则桌面上,显示的鼠标光标都是我自定义的鼠标光标,当程序退出的时候,鼠标恢复为原来的形状,我发现改变系统光标是不行的,那样的话其它程序窗口中的光标如何改?这个办法行不通,我写了个钩子来屏蔽WM_SETCURSOR,但是不知道为什么屏蔽不了,麻烦各位看看
    HHOOK      glhHook      = NULL;       // °²×°µÄÊó±ê¹³×Ó¾ä±ú
    HINSTANCE  glhInstance  = NULL;   
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
    glhInstance = (HINSTANCE) hModule;
        
        switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
    break;
        }
        return TRUE;
    }////////////////////////////////////////////////////////////////////////////////////
    LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    BOOL fEatKeystroke = FALSE;

    // MSG   *pMsg   =   (MSG*)lParam;   
    CWPSTRUCT *pMsg =(CWPSTRUCT*)lParam;
    if (nCode >= 0) 
    {


    switch (pMsg->message) 
    {
    case WM_SETCURSOR:
        
     //  MessageBox(NULL,"1111","111",MB_OK);
    fEatKeystroke=true;
        
    break;

    default:
    fEatKeystroke=false;
    break;
    }
    }  return (fEatKeystroke ? TRUE : CallNextHookEx(glhHook,nCode,wParam,lParam));
    }void   StartMsgHook()
    { glhHook = SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc ,glhInstance,0);
    }void  StopMsgHook()
    {
    // Ð¶Ôع³×Ó
    if (glhHook!=NULL)
    UnhookWindowsHookEx(glhHook);}
    鼠标移动的时候WM_SETCURSOR绝对可以捕获的到的,就是屏蔽不掉,其它程序任能接收到WM_SETCURSOR
      

  9.   

    楼主DllMain函数的switch部分的具体内容是被省略了还是没写啊?
      

  10.   

    DllMain函数的switch部分的具体内容,对我的用处不大,在这个程序中也没有什么作用,所以没有写
      

  11.   

    如果lz发现所有的WM_SETCURSOR都捕获到了,但是屏蔽不了的话,有可能就是因为这个钩子的优先级不是最高,其他程序已经先收到了WM_SETCURSOR.
      

  12.   

    对了,突然想到,可以在每次接收到WM_SETCURSOR的时候到调用一次
    SetSystemCursor(::LoadCursor(NULL,MAKEINTRESOURCE(IDC_MYCURSOR)),OCR_NORMAL);
    这样的话就算别的程序先收到WM_SETCURSOR改变了Cursor,lz的程序也会立刻把它改回来,
    可以试试看效果如何。
      

  13.   

    不太明白lz的意思,我的意思是,每次别的程序改变了光标,都会发出WM_SETCURSOR,然后你的程序捕获每一个WM_SETCURSOR,改成自己的光标,然后返回true,不让消息再传下去.这样实现不了吗?
      

  14.   

    恩,实现不了的用这个钩子可以实现,但是在有一些窗口上就修改不了,鼠标移动的话可以修改成我自定义的光标,如果鼠标不移动了,光标又变成其它窗口下的光标了
    #include <windows.h>
    #include "resource.h"#pragma data_seg("shareddata")
    HHOOK      glhHook      = NULL;       // 安装的鼠标钩子句柄
     
    #pragma data_seg()
    #pragma comment(linker,"/SECTION:shareddata,RWS")HINSTANCE  glhInstance  = NULL; 
    #define KeyBoardDll_API  extern "C"  __declspec( dllexport )
    KeyBoardDll_API  void   StartMsgHook();
    KeyBoardDll_API  void   StopMsgHook();
    KeyBoardDll_API   void  GetCount(HWND);
    POINT  ptNew;
    long lCount=0;
    HWND  g_hwnd;
    char szTMP[200];
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
    glhInstance = (HINSTANCE) hModule;
    //    HANDLE hProcess;
    // hProcess= GetCurrentProcess();
    // SetPriorityClass(hProcess,HIGH_PRIORITY_CLASS);
        switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
    break;
        }
        return TRUE;
    }////////////////////////////////////////////////////////////////////////////////////
    LRESULT CALLBACK CallWndRetProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    BOOL fEatKeystroke = FALSE;
    HDC hdc;
    HCURSOR hCursor;
    // MSG   *pMsg   =   (MSG*)lParam;   
    CWPRETSTRUCT *pMsg =(CWPRETSTRUCT*)lParam;
    MSG   msg;
    if (nCode >= 0) 
    {


    switch (pMsg->message) 
    {

    case WM_SETCURSOR:
        
     //  MessageBox(NULL,"1111","111",MB_OK);
    SetCursor(LoadCursor(glhInstance,MAKEINTRESOURCE(IDC_CURSOR1)));

    fEatKeystroke=true;
    break;
      
    case WM_DESTROY:

    break;
    default:
    fEatKeystroke=false;
    break;
    }
    }  return (fEatKeystroke ? TRUE : CallNextHookEx(glhHook,nCode,wParam,lParam));
    }
    void   StartMsgHook()
    {
    glhHook = SetWindowsHookEx(WH_CALLWNDPROCRET,CallWndRetProc  ,glhInstance,0);}void  StopMsgHook()
    {
    // 卸载钩子
    if (glhHook!=NULL)
    UnhookWindowsHookEx(glhHook);}
    void  GetCount(HWND hwnd)
    {
        g_hwnd=hwnd;
         
    }