如何在单独的窗口中混合使用C ++和外部按钮?

时间:2009-10-16 21:14:38

标签: c++

我想在开始>运行时创建一个C++按钮,但是当我这样做时,它不会发出信号事件?

对不起,我看到你没有得到这个问题。

好的,基本上当你创建一个CreateWindowEx()的按钮时;我想这样做,但是在SetPArent放置了一个不同的窗口,我现在已经完成了按钮不起作用所以当从运行窗口单击它时,我需要我的程序来获取!

是的,你拥有它,但它并没有让按钮成为它点击我的程序时遇到的问题,因为它不再属于它了!

2 个答案:

答案 0 :(得分:7)

您需要将Windows中已知的古老但仍支持的技术应用为子类化;很好地解释了here(15年前的文章,但仍然非常有效;-)。正如本文所说,

  

子类化是一种允许的技术   拦截消息的应用程序   注定要换另一个窗口。一个   应用程序可以增加,监控或   修改a的默认行为   窗口拦截消息意味着   换另一个窗口。

您需要“实例子类化”,因为您只对一个窗口感兴趣(您的新按钮,或者您SetParent编辑新按钮的按钮;如果您决定子类化属于另一个进程的窗口,您还需要使用本文中介绍的注入技术,例如,将DLL注入系统进程并使用WH_CBT钩子监视事件,以及类似。但我认为你可以将按钮保留在你自己的进程中,即使你SetParent它是一个属于不同进程的窗口,在这种情况下你可以完全在你自己的进程中进行实例子类化,这是如果可行则更简单。

“Superclassing”是“子类化”的替代方法,也在文章中进行了解释,但与实例子类化相比似乎没有提供许多优势(尽管它可能与 global 子类化进行比较......但是,无论如何,这不是你需要的。)

您可以找到有关此类主题的其他有趣文章hereherehere(为子类化开发一个大而丰富的C ++库 - 但同时也展示了一种更简单的方法基于您可能更喜欢的钩子)。每篇文章都有不同的立场和代码示例,所以我认为有很多东西可以帮助您找到适合您特定需求的正确思维模式和代码!

答案 1 :(得分:2)

好的,我会尽我所能 - 据我了解你,你正试图在一个现有的窗口中注入一个按钮。这意味着:您的工具在某个窗口中创建了一个不属于您的应用程序的按钮。现在,您希望在按下该按钮时收到通知。到目前为止我是否正确?

要获得有关按下按钮的通知,您需要获取相应的窗口消息,这仅在您将“注入”不同的WndProc注入窗口时才有效。实际上我不知道它应该如何运作,但我隐约记得像GetWindowLongSetWindowLong这样的函数。也许他们会帮忙?

修改
我在MSDN上搜索了一下:虽然你可以使用GetWindowLong获取窗口WndProc的地址,但是你不能在Windows NT / 2000 / XP上使用SetWindowLong来设置WndProc(我猜想) 。请参阅here (MSDN)

所以你可以做的是安装一个全局消息钩子,它拦截所有窗口消息,过滤那些你注入按钮的窗口,然后找到你的消息。但是,如果你遇到这个问题,那我就错了,因为几年前我已经做过类似的事了,但这会是一个新问题。

编辑2
请参阅Alex Martinellis关于如何定义钩子的答案。当我谈到定义全局消息钩子来截取你注入按钮的窗口的窗口消息时,我认为他正在描述我所指的技术。