请教如何捕获另一个程序的BUTTON按钮事件??急急急!!!!

SkyQin711 2010-03-11 04:11:00
假如我有两个程序: A 和 B。

现在我需要通过 A 程序将 B 程序窗体上的一个BUTTON按钮事件捕获提供给A程序使用。


问题: 1、现在我已经通过 API 将 B 程序的BUTTON按钮的句柄捕获,但不知道怎样将捕获的BUTTON按钮 事件提取出来??

2、在 A 程序 能不能 将 B程序 的 BUTTON 按钮 调为不起作用??


大侠们帮帮忙,感激不尽!!!


...全文
157 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2010-03-11
  • 打赏
  • 举报
回复
用hook
编程技术应用 2010-03-11
  • 打赏
  • 举报
回复

平台vs2008 开发语言c# 运行时需要.net framework 3.5支持
好啦,源码在下面啦:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;


namespace 灰色按钮终结者
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}

public delegate bool CallBack(int hwnd, int lParam); //定义托管回调函数;

[DllImport("user32.dll", EntryPoint = "EnumWindows")]
public static extern int EnumWindows( //枚举顶层窗体;
CallBack lpEnumFunc,
int lParam
);

[DllImport("user32.dll", EntryPoint = "EnumChildWindows")]
public static extern int EnumChildWindows( //枚举子窗体;
int hWndParent,
CallBack lpEnumFunc,
int lParam
);

[DllImport("user32.dll", EntryPoint = "IsWindowEnabled")]
public static extern int IsWindowEnabled( //判断子窗体;
int hwnd
);

[DllImport("user32.dll", EntryPoint = "EnableWindow")]
public static extern int EnableWindow ( //使能子窗体;
int hwnd,
int fEnable
);
list<int> hwndlst=new list<int>(); //定义泛型集合用于存储顶层窗体的句柄;
public static bool EnumWindowsHandle(int hwnd, int lParam) //回调函数hwnd是enumwindows函数传过来的句柄;
{
hwndlst.Add(hwnd);
return true;
}

public void EnumChiledWindowsHandle() //定义啦一个方法,调用进行啦;
{
CallBack mycallback = new CallBack(MainForm.EnabledWindow); //定义回调函数,MainForm即为此窗体的名字;
for (int i = 0; i < hwndlst.Count; i++)
{
EnumChildWindows(hwndlst, mycallback, 0);
}
}

public static bool EnabledWindow(int hwnd, int lp) //这里又是一个回调函数,是给enumchildwindows定义的;hwnd即是子窗体的句柄;
{
try
{
if (IsWindowEnabled(hwnd) == 0) //如果窗体不能用,即enabled=false;
{
EnableWindow(hwnd, 1); //用api函数使能窗体;
return true;
}
}
catch { }
return true;
}

}

}



这句 EnableWindow(hwnd, 0); //用api函数使其不能;
SkyQin711 2010-03-11
  • 打赏
  • 举报
回复

还有没有其他办法? 因为 B 程序有可能是外部的已打包程序或者其他语言写的程序。 而不一定是自己写的程序??
fling_boy 2010-03-11
  • 打赏
  • 举报
回复
如果b程序不是自己写的,那就做两个全局钩子(键盘和鼠标),监视是否点击b的button,是的话先过滤消息,然后发给a.
fling_boy 2010-03-11
  • 打赏
  • 举报
回复
如果两个程序都是自己写的,那就在b的事件中加一个sendmessage到a,这样a才能知道
在a的程序中如果让b的button无效,也是sendmessage 其中是hwnd,wm_enabled
SkyQin711 2010-03-11
  • 打赏
  • 举报
回复

我指的 A 和 B 是两个独立的程序,我的需求是 在 点击 B 程序的 BUTTON 时,A 程序要立即 捕获 B 程序点击的 BUTTON 事件供自己使用,并且让 B 的 BUTTON 事件失效。

A 和 B 是不存在任何关联的。
  • 打赏
  • 举报
回复
你的目的没有讲清吧,首先,B窗体是有焦点的,这时响应了B窗体的button,在此事件中,你可以定义再定义一个事件,相当于冒泡吧,你在A程序中响应这个事件,就可以了。
在A程序中当然可以设置了,只要你将button设置成public就可以了

111,115

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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