光标、光标、光标、光标、光标、光标、光标、 在设置前应该先GETCURSOR保存旧光标,再设置回来 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 又这方面的代码不?发给我嘛谢谢;了幽香 [email protected] 函数功能:该函数使一个应用程序定制系统光标。它用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。 HCURSOR holdcur=::LoadCursor(NULL,MAKEINTRESOURCE(OCR_NORMAL));SetSystemCursor(::LoadCursor(NULL,MAKEINTRESOURCE(IDC_MYCURSOR)),OCR_NORMAL);//替换SetSystemCursor(holdcur,OCR_NORMAL);//还原试试看 兄弟我试过了你说的方法了,可以替换 但是改 不回来 ,我替换 了想再改回来啊 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也不行 因此hour不能是由LoadCursor函数载入的光标。要指定一个从资源载入的光标,先用CopyCursor函数复制该光标,然后把该副本传送给SetSystemCursor函数。SetSystemCursor(::LoadCursor(hInst,MAKEINTRESOURCE(IDC_MYCURSOR)),OCR_NORMAL)这个函数你调用成功了?我刚测试的时候都是返回0 搜索了下,有人说WINDOWS NT下好象无法还原 可以用SystemParametersInfo来还原:SystemParametersInfo(SPI_SETCURSORS, 0, NULL, 0); 楼上的多谢了呀!!!在我绝望的时候帮了我一把,但是我想做一个程序,当我的程序运行的时候,不管鼠标移动到桌面上任何窗口上,或则桌面上,显示的鼠标光标都是我自定义的鼠标光标,当程序退出的时候,鼠标恢复为原来的形状,我发现改变系统光标是不行的,那样的话其它程序窗口中的光标如何改?这个办法行不通,我写了个钩子来屏蔽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 楼主DllMain函数的switch部分的具体内容是被省略了还是没写啊? DllMain函数的switch部分的具体内容,对我的用处不大,在这个程序中也没有什么作用,所以没有写 如果lz发现所有的WM_SETCURSOR都捕获到了,但是屏蔽不了的话,有可能就是因为这个钩子的优先级不是最高,其他程序已经先收到了WM_SETCURSOR. 对了,突然想到,可以在每次接收到WM_SETCURSOR的时候到调用一次SetSystemCursor(::LoadCursor(NULL,MAKEINTRESOURCE(IDC_MYCURSOR)),OCR_NORMAL);这样的话就算别的程序先收到WM_SETCURSOR改变了Cursor,lz的程序也会立刻把它改回来,可以试试看效果如何。 不太明白lz的意思,我的意思是,每次别的程序改变了光标,都会发出WM_SETCURSOR,然后你的程序捕获每一个WM_SETCURSOR,改成自己的光标,然后返回true,不让消息再传下去.这样实现不了吗? 恩,实现不了的用这个钩子可以实现,但是在有一些窗口上就修改不了,鼠标移动的话可以修改成我自定义的光标,如果鼠标不移动了,光标又变成其它窗口下的光标了#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; } CMFCMenuButton的菜单如何响应? 简单问题,图像显示不了 键盘输入问题 求助:请帮忙分析 为何我的spi dll不能工作? 怎么在DLG中画点和线???? 数据库存储巨难的问题,不要代码,给出方案就给分。UP者也有份~~~~~~~~~~~~~~~~~~~~ 有关SMTP编码转换问题 求系统学习hook的书籍名称和资料 怎样做到象WINZIP一样,在列表控件中双击文件,就可以用相应的应用程序打开该文件? 视图 分成多区同时显示的问题??? 关于自定义消息接收的问题. 全局鼠标钩子老是出问题
SetSystemCursor(::LoadCursor(NULL,MAKEINTRESOURCE(IDC_MYCURSOR)),OCR_NORMAL);//替换
SetSystemCursor(holdcur,OCR_NORMAL);//还原试试看
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也不行
SetSystemCursor(::LoadCursor(hInst,MAKEINTRESOURCE(IDC_MYCURSOR)),OCR_NORMAL)
这个函数你调用成功了?我刚测试的时候都是返回0
SystemParametersInfo(SPI_SETCURSORS, 0, NULL, 0);
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
SetSystemCursor(::LoadCursor(NULL,MAKEINTRESOURCE(IDC_MYCURSOR)),OCR_NORMAL);
这样的话就算别的程序先收到WM_SETCURSOR改变了Cursor,lz的程序也会立刻把它改回来,
可以试试看效果如何。
#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;
}