用vc编程控制别的软件时候,怎样检测另外一个进程的一个窗口的菜单项是否可用啊?

foxzhouxp 2016-08-16 06:06:12
各位哥们,用vc编程控制别的软件时候,怎样检测另外一个进程中的一个窗口的菜单项是否可用啊,就是说如果它是灰色不可用状态,我就不发消息给另外一个进程的窗口,如果它是黑色可用状态,我就发消息给那个窗口,谢谢你们了。

...全文
614 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 33 楼 foxzhouxp 的回复:
兄弟,你说的这个枚举窗口函数,这种方法,我在mfc中基于对话框建一个工程,在类中用这两个函数出错啊,加::符号也不得,提示是参数有问题,帮写个案例如何,非常感谢!
汗,FindWindow肯定行的。不知道你哪里有问题了。。。 这样,你先调通控制记事本的,再调通控制其他的,一步一步来,不要急于求成。
赵4老师 2016-08-18
  • 打赏
  • 举报
回复
推荐使用spy4win软件。
foxzhouxp 2016-08-18
  • 打赏
  • 举报
回复
兄弟,你说的这个枚举窗口函数,这种方法,我在mfc中基于对话框建一个工程,在类中用这两个函数出错啊,加::符号也不得,提示是参数有问题,帮写个案例如何,非常感谢!
  • 打赏
  • 举报
回复
引用 31 楼 foxzhouxp 的回复:
相同的,但是就是不行,真的。
那就枚举窗口 参考这个:http://blog.sina.com.cn/s/blog_40d91693010008iv.html
foxzhouxp 2016-08-18
  • 打赏
  • 举报
回复
相同的,但是就是不行,真的。
  • 打赏
  • 举报
回复
引用 29 楼 foxzhouxp 的回复:
我试了,在HWND hWnd=::FindWindow("CabinetWClass","2016VC");中,把类名和窗口名都写上去,也不得啊
类名可以不用写的。 主要确认窗口标题栏上的字,和第二个参数是不是相同就可以了。
foxzhouxp 2016-08-18
  • 打赏
  • 举报
回复
我试了,在HWND hWnd=::FindWindow("CabinetWClass","2016VC");中,把类名和窗口名都写上去,也不得啊
  • 打赏
  • 举报
回复
引用 26 楼 foxzhouxp 的回复:
待我认真想想先,对了,貌似发现新问题了,,你帮写的案例代码,是读取记事本窗口的菜单命令状态,只把记事本那个窗口改为我的电脑窗口,好像得不到结果啊,说找不到子菜单,什么原因呢?谢谢!
你得确认窗口名对不对。。。 可以用spy++看看窗口名。
foxzhouxp 2016-08-18
  • 打赏
  • 举报
回复
就是说打开资源管理器是的一个有标题的窗口,代码就不正确了,什么原因?
foxzhouxp 2016-08-18
  • 打赏
  • 举报
回复
待我认真想想先,对了,貌似发现新问题了,,你帮写的案例代码,是读取记事本窗口的菜单命令状态,只把记事本那个窗口改为我的电脑窗口,好像得不到结果啊,说找不到子菜单,什么原因呢?谢谢!
  • 打赏
  • 举报
回复
引用 24 楼 foxzhouxp 的回复:
getmenustate返回的是标志的掩码啊。你下面说的 假如:MF_DISABLE 等于 000001000000,ulState等于000011111100 按位与的运算如下: 000001000000 000011111100 000001000000 结果不全为0,结果为真。说明MF_DISABLE成立。 我怎么觉得是不是有些问题?谢谢!
什么问题? 觉得那里不清楚,再说说呗。
foxzhouxp 2016-08-18
  • 打赏
  • 举报
回复
getmenustate返回的是标志的掩码啊。你下面说的
假如:MF_DISABLE 等于 000001000000,ulState等于000011111100
按位与的运算如下:
000001000000
000011111100
000001000000
结果不全为0,结果为真。说明MF_DISABLE成立。

我怎么觉得是不是有些问题?谢谢!
  • 打赏
  • 举报
回复
我晕,运算符前后空格那块我说的不对哈。。。
  • 打赏
  • 举报
回复
引用 20 楼 foxzhouxp 的回复:
f  (ulState & MF_DISABLED) {    OutputDebugString(_T("被禁用")); } 我不太明白这个与运算啊,好像c++中的与是用&&两个的吧?一个是取地址运算。能用二进制简单说明下吗?000000001什么的,这个&,msdn里说明好像还有个!号的,十分感谢!
1.如果&后面紧跟的是变量,并且没有空格的时候,是取地址。 2.如果&后面有空格,是按位与运算;按位与,就是每一位都与运算一次。 3.&&是与运算。运算符前后两个值都为非零,则结果为真。 按位与比如: 000001000000 001000000000 结果为假。 假如:MF_DISABLE 等于 000001000000,ulState等于000011111100 按位与的运算如下: 000001000000 000011111100 000001000000 结果不全为0,结果为真。说明MF_DISABLE成立。
foxzhouxp 2016-08-18
  • 打赏
  • 举报
回复
f  (ulState & MF_DISABLED) {
   OutputDebugString(_T("被禁用"));
}

我不太明白这个与运算啊,好像c++中的与是用&&两个的吧?一个是取地址运算。能用二进制简单说明下吗?000000001什么的,这个&,msdn里说明好像还有个!号的,十分感谢!
foxzhouxp 2016-08-18
  • 打赏
  • 举报
回复
f  (ulState & MF_DISABLED) {
   OutputDebugString(_T("被禁用"));
}

我不太明白这个与运算啊,好像c++中的与是用&&两个的吧?一个是取地址运算。能用二进制简单说明下吗?000000001什么的,这个&,msdn里说明好像还有个!号的,十分感谢!
  • 打赏
  • 举报
回复
引用 18 楼 foxzhouxp 的回复:
16楼的兄弟正解!!!! 用这种掩码结果怎么写啊?谢谢。 GetMenuState编辑 锁定 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!GetMenuState是一个计算机函数,用于取得菜单标志,主要参数有hMenu、uld、MF_BYCOMMAND、返回值等。 外文名GetMenuState 类 别计算机函数 功 能取得菜单标志 原 型UINT GetMenuState 目录1 参数 2 菜单标志 GetMenuState参数编辑 hMenu:含有其菜单项的标志将被提取得的菜单的句柄。 uld:其某单标志将被取得的菜单项,此参数含义由参数uFlags决定。 UFlags:用于指定参数uld的含义的值。此参数可取下列值之一: MF_BYCOMMAND:表示参数uld给出菜单项的标识符。如果MF_BYCOMMAND和MF_BYPOSITION都没被指定,则MF_BYCOMMAND是缺省值。 MF_BYPOSITION:表示参数uld给出菜单项相对于零的位置。 返回值:如果指定的项不存在,返回值是OXFFFFFFFF;如果菜单项打开了一个子菜单,则返回值的低位含有与菜单相联系的菜单标志,高位含有子菜单的项数。否则,返回值是菜单标志的掩码(布尔OR)。 GetMenuState菜单标志编辑 MF_CHECKED:放置选取标记于菜单项旁边(只用于下拉式菜单、子菜单或快捷菜单)。 MF_DISABLED:使菜单项无效。MF_GRAYED:使菜单项无效并交灰。MF_HILITE:加亮菜单项。 MF_MENUBARBREAK:对下拉式菜单、子菜单和快捷菜单,新列和旧列由垂直线隔开,其余功能同MF_MENUBREAK标志。 MF_MENUBREAK:将菜单项放于新行(对菜单条)或无分隔列地放于新列(对下拉式菜单、子菜单或快捷菜单)。 MF_SEPARATOR:创建一个水平分隔线(只用于下拉式菜单、子菜单或快捷菜单)。
想检测哪一项,就和相应的掩码进行与运算,如果结果不为0,说明有这一项,比如: if (ulState & MF_DISABLED) { OutputDebugString(_T("被禁用")); }
foxzhouxp 2016-08-18
  • 打赏
  • 举报
回复
16楼的兄弟正解!!!! 用这种掩码结果怎么写啊?谢谢。 GetMenuState编辑 锁定 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!GetMenuState是一个计算机函数,用于取得菜单标志,主要参数有hMenu、uld、MF_BYCOMMAND、返回值等。 外文名GetMenuState 类 别计算机函数 功 能取得菜单标志 原 型UINT GetMenuState 目录1 参数 2 菜单标志 GetMenuState参数编辑 hMenu:含有其菜单项的标志将被提取得的菜单的句柄。 uld:其某单标志将被取得的菜单项,此参数含义由参数uFlags决定。 UFlags:用于指定参数uld的含义的值。此参数可取下列值之一: MF_BYCOMMAND:表示参数uld给出菜单项的标识符。如果MF_BYCOMMAND和MF_BYPOSITION都没被指定,则MF_BYCOMMAND是缺省值。 MF_BYPOSITION:表示参数uld给出菜单项相对于零的位置。 返回值:如果指定的项不存在,返回值是OXFFFFFFFF;如果菜单项打开了一个子菜单,则返回值的低位含有与菜单相联系的菜单标志,高位含有子菜单的项数。否则,返回值是菜单标志的掩码(布尔OR)。 GetMenuState菜单标志编辑 MF_CHECKED:放置选取标记于菜单项旁边(只用于下拉式菜单、子菜单或快捷菜单)。 MF_DISABLED:使菜单项无效。MF_GRAYED:使菜单项无效并交灰。MF_HILITE:加亮菜单项。 MF_MENUBARBREAK:对下拉式菜单、子菜单和快捷菜单,新列和旧列由垂直线隔开,其余功能同MF_MENUBREAK标志。 MF_MENUBREAK:将菜单项放于新行(对菜单条)或无分隔列地放于新列(对下拉式菜单、子菜单或快捷菜单)。 MF_SEPARATOR:创建一个水平分隔线(只用于下拉式菜单、子菜单或快捷菜单)。
foxzhouxp 2016-08-17
  • 打赏
  • 举报
回复
不好意思呀,我水平差,呵,其实我是想直接让那个窗口最小化后也可以检测到它的某个菜单项命令是否可用状态啊。不知我这样说你明白我的意思没有,谢谢
  • 打赏
  • 举报
回复
引用 7 楼 foxzhouxp 的回复:
兄弟,其它我是想检测某个菜单命令是否可用啊?比如检测“粘贴”,“撤消”这些具体菜单命令是否可用状态。IswindowEnable怎么能做到呢,说具体一些好不好,谢谢了。最好写具体代码出来,
windowformpoint根据屏幕上的点,获取窗口(你得知道另外一个窗口的菜单所在的位置) IsWindowEnable根据上面获取到的窗口,就可以知道这个窗口(菜单)是否可用了。 好吧,如果这两步你不知道怎么用,那么请告诉我,你都能获得要控制的窗口那些信息? 如果什么都不知道,那真的没法玩了。。 从头开始讲: 1.进程ID总知道吧?如果不知道,那就枚举进程,找到想控制的进程 2.如果第1步步想做,那可以枚举所有窗口,找到要检测的窗口。 3.找到菜单,IsWindowEnable
加载更多回复(14)

16,472

社区成员

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

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

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