光标、光标、光标、光标、光标、光标、光标、

yierham 2007-08-21 06:01:27
用SetSystemCursor(::LoadCursor(NULL,MAKEINTRESOURCE(IDC_MYCURSOR)),OCR_NORMAL);
改变系统的光标后如何将它再设置回来
...全文
437 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
yierham 2007-08-30
  • 打赏
  • 举报
回复
恩,实现不了的用这个钩子可以实现,但是在有一些窗口上就修改不了,鼠标移动的话可以修改成我自定义的光标,如果鼠标不移动了,光标又变成其它窗口下的光标了
#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;

}
subchap 2007-08-28
  • 打赏
  • 举报
回复
不太明白lz的意思,我的意思是,每次别的程序改变了光标,都会发出WM_SETCURSOR,然后你的程序捕获每一个WM_SETCURSOR,改成自己的光标,然后返回true,不让消息再传下去.这样实现不了吗?
yierham 2007-08-28
  • 打赏
  • 举报
回复
兄台的 办法是 改变系统光标我试过了,如果 别 的程序窗口没有用系统的光标的话,也是 用的自定义的光标的话,你是没有办法 实现你的效果的
subchap 2007-08-27
  • 打赏
  • 举报
回复
对了,突然想到,可以在每次接收到WM_SETCURSOR的时候到调用一次
SetSystemCursor(::LoadCursor(NULL,MAKEINTRESOURCE(IDC_MYCURSOR)),OCR_NORMAL);
这样的话就算别的程序先收到WM_SETCURSOR改变了Cursor,lz的程序也会立刻把它改回来,
可以试试看效果如何。
subchap 2007-08-27
  • 打赏
  • 举报
回复
这个不太清楚,可以网上搜搜看
subchap 2007-08-26
  • 打赏
  • 举报
回复
如果lz发现所有的WM_SETCURSOR都捕获到了,但是屏蔽不了的话,有可能就是因为这个钩子的优先级不是最高,其他程序已经先收到了WM_SETCURSOR.
yierham 2007-08-26
  • 打赏
  • 举报
回复
请问楼上的怎么设置优先级
subchap 2007-08-25
  • 打赏
  • 举报
回复
楼主DllMain函数的switch部分的具体内容是被省略了还是没写啊?
yierham 2007-08-25
  • 打赏
  • 举报
回复
楼上的多谢了呀!!!在我绝望的时候帮了我一把,但是我想做一个程序,当我的程序运行的时候,不管鼠标移动到桌面上任何窗口上,或则桌面上,显示的鼠标光标都是我自定义的鼠标光标,当程序退出的时候,鼠标恢复为原来的形状,我发现改变系统光标是不行的,那样的话其它程序窗口中的光标如何改?这个办法行不通,我写了个钩子来屏蔽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
yierham 2007-08-25
  • 打赏
  • 举报
回复
DllMain函数的switch部分的具体内容,对我的用处不大,在这个程序中也没有什么作用,所以没有写
subchap 2007-08-24
  • 打赏
  • 举报
回复
可以用SystemParametersInfo来还原:
SystemParametersInfo(SPI_SETCURSORS, 0, NULL, 0);
yierham 2007-08-24
  • 打赏
  • 举报
回复
算了你们都解决不了,明天来揭贴,自己慢慢弄吧
yierham 2007-08-24
  • 打赏
  • 举报
回复
你放心我调用成功了的效果都出来了的,就是设置不回去啊郁闷
yierham 2007-08-22
  • 打赏
  • 举报
回复
兄弟我试过了你说的方法了,可以替换 但是改 不回来 ,我替换 了想再改回来啊
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也不行
aa65433 2007-08-22
  • 打赏
  • 举报
回复
HCURSOR holdcur=::LoadCursor(NULL,MAKEINTRESOURCE(OCR_NORMAL));
SetSystemCursor(::LoadCursor(NULL,MAKEINTRESOURCE(IDC_MYCURSOR)),OCR_NORMAL);//替换
SetSystemCursor(holdcur,OCR_NORMAL);//还原

试试看
aa65433 2007-08-22
  • 打赏
  • 举报
回复
函数功能:该函数使一个应用程序定制系统光标。它用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。
aa65433 2007-08-22
  • 打赏
  • 举报
回复
搜索了下,有人说WINDOWS NT下好象无法还原。。。
aa65433 2007-08-22
  • 打赏
  • 举报
回复
因此hour不能是由LoadCursor函数载入的光标。要指定一个从资源载入的光标,先用CopyCursor函数复制该光标,然后把该副本传送给SetSystemCursor函数。
SetSystemCursor(::LoadCursor(hInst,MAKEINTRESOURCE(IDC_MYCURSOR)),OCR_NORMAL)
这个函数你调用成功了?我刚测试的时候都是返回0
yierham 2007-08-21
  • 打赏
  • 举报
回复
又这方面的代码不?发给我嘛谢谢;了幽香 yierhan111@163.com
aa65433 2007-08-21
  • 打赏
  • 举报
回复
在设置前应该先GETCURSOR保存旧光标,再设置回来

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧