WM_SETTEXT 消息

Robert2001 2001-02-04 09:20:00
这个 问题够变态的!!
我试了一晚上了。
托盘 时钟区的 句柄是 0x00000C90(spy++ 得到的)
系统通过定期的 发送 WM_SETTEXT 消息 来改变那里的值 比如 "20:55"
我也 用SendMessage 来发送 WM_SETTEXT 模拟系统消息 比如 "20:11" 但是毫无反应!
但是同样 如果换成其他的 窗口 比如 “扫雷” 就ok!!!
晕啊!!! 来啊!谁来 解释一下为什么!!
谁能正确的回答这个问题! 我给100分!!! 一会就去发一个新帖子!!!
...全文
660 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Robert2001 2001-02-05
  • 打赏
  • 举报
回复
**********************************
**糟糕! 我忘了 说了! WM_SETTEXT 是向 Caption 写!!!!!*
**********************************
to:YuHao() 多谢  看来我的问题说的不是很明白
YuHao 2001-02-05
  • 打赏
  • 举报
回复
我的代码都是试过可以的,不然我不会贴出来。你的Windows是哪个版本?我第二次用的代码是在Win98第二版下面通过的。好象不同版本的Windows有些行为就是不一样,莫名其妙。
我知道用WM_SETTEXT可以成功的替换大部分窗口的标题,不过我对此方法总是有点疑问。对不同进程中的窗口,传递字符串参数怎么会成功呢?我一直想不明白。另外那个时钟窗口是由Shell管理的,可能和常规的窗口不太一样,对普通窗口能成功的方法对外壳的窗口就未必。
Robert2001 2001-02-05
  • 打赏
  • 举报
回复
to:YuHao()
谢谢你的回答! 你那里实验成功了吗
 
你的代码 我试过了 不成。
SetWindowText 发送的就是 WM_SETTEXT 消息 我都已经试过了 没戏!!!

真正令我纳闷的 问题是 同样的代码! 对有些 窗口“比如扫雷” 就能成功改变他的Caption
但是对于 有些窗口不行!!!
而且我也用SPY++看过 系统 明明就是调用 WM_SETTEXT 来改变那里的数值的!!
真是烦呢!!!! 微软耍赖!!!!
YuHao 2001-02-05
  • 打赏
  • 举报
回复
对不起,我也有点疏漏,我在Win97平台下测试那段代码是通过了的,但是现在发现在Win98底下不一样,在Win97下面TrayClockWClass是个无标题的窗口,而98下面则是有标题的,标题就是时间。用WM_SETTEXT确实不行,用SetWindowText好象也不行,不过把我的办法变通一下也可以:
HWND hwnd = (HWND)0xc90;
HDC hdc = ::GetWindowDC(hwnd);
TextOut(hdc,0,0,"MyTime",6);
::ReleaseDC(hwnd,hdc);
Robert2001 2001-02-05
  • 打赏
  • 举报
回复
to:lhxx(随风) 
WM_SETTEXT 会根据不同的窗口把TEXT发送到不同的位置。
如果是目标窗口是 EDIT 或是COMBOX 那就往那里面发送字体,如果是 其他的窗口 那么TEXT就发往 标题。
随风bj 2001-02-05
  • 打赏
  • 举报
回复
因为它不是类似与EDIT类的窗口
YuHao 2001-02-05
  • 打赏
  • 举报
回复
对扫雷也可以啊,我刚才试过了。不过这个方法说实在的并不算太好,如果把窗口最小化再恢复,写的内容就不见了。正规的方法应该是截获窗口的WM_NCPAINT消息自己处理。不过要截获其他进程中的窗口消息不太容易,再要保证不对原来程序造成不良影响就更难了。毕竟象TrayClockWClass这样的窗口,MS肯定是不希望你对它任意改动的,所以你也别想象其他的窗口一样,简简单单的一个函数就能搞定。
用FindWindow好象是不行。你可以用间接一点的方法,先找Shell_TrayWnd窗口,再查找属于它的TrayClockWClass子窗口。
YuHao 2001-02-05
  • 打赏
  • 举报
回复
对扫雷也可以啊,我刚才试过了。不过这个方法说实在的并不算太好,如果把窗口最小化再恢复,写的内容就不见了。正规的方法应该是截获窗口的WM_NCPAINT消息自己处理。不过要截获其他进程中的窗口消息不太容易,再要保证不对原来程序造成不良影响就更难了。毕竟象TrayClockWClass这样的窗口,MS肯定是不希望你对它任意改动的,所以你也别想象其他的窗口一样,简简单单的一个函数就能搞定。
用FindWindow好象是不行。你可以用间接一点的方法,先找Shell_TrayWnd窗口,再查找属于它的TrayClockWClass子窗口。
YuHao 2001-02-05
  • 打赏
  • 举报
回复
对扫雷也可以啊,我刚才试过了。不过这个方法说实在的并不算太好,如果把窗口最小化再恢复,写的内容就不见了。正规的方法应该是截获窗口的WM_NCPAINT消息自己处理。不过要截获其他进程中的窗口消息不太容易,再要保证不对原来程序造成不良影响就更难了。毕竟象TrayClockWClass这样的窗口,MS肯定是不希望你对它任意改动的,所以你也别想象其他的窗口一样,简简单单的一个函数就能搞定。
用FindWindow好象是不行。你可以用间接一点的方法,先找Shell_TrayWnd窗口,再查找属于它的TrayClockWClass子窗口。
YuHao 2001-02-05
  • 打赏
  • 举报
回复
对扫雷也可以啊,我刚才试过了。不过这个方法说实在的并不算太好,如果把窗口最小化再恢复,写的内容就不见了。正规的方法应该是截获窗口的WM_NCPAINT消息自己处理。不过要截获其他进程中的窗口消息不太容易,再要保证不对原来程序造成不良影响就更难了。毕竟象TrayClockWClass这样的窗口,MS肯定是不希望你对它任意改动的,所以你也别想象其他的窗口一样,简简单单的一个函数就能搞定。
用FindWindow好象是不行。你可以用间接一点的方法,先找Shell_TrayWnd窗口,再查找属于它的TrayClockWClass子窗口。
Robert2001 2001-02-05
  • 打赏
  • 举报
回复
成了!! 我犯了个错误。
你的代码很完全可以!!! (个人感觉有点变态)
 这么变态的招你都能想出来。哈哈
不过 说老实话,用完了你这种方法我更糊涂了。你这个方法对TrayClockWClass 可是对其他的窗口就又不行了。
到底TrayClockWClass 是一个该死的什么类型的窗口啊!!!???????
 而且 我用FindWindow("classname",NULL); 也得不到他的句柄,同样其他的窗口 比如扫雷 就能得到。
YuHao 2001-02-04
  • 打赏
  • 举报
回复
我觉得你可以直接向窗口输出,比如:
HWND hwnd = (HWND)0xc90;
HDC hdc = ::GetDC(hwnd);
TextOut(hdc,0,0,"MyTime",6);
::ReleaseDC(hwnd,hdc);

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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