问题标签 [wndproc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
30441 浏览

winforms - 如何使用 Windows 窗体在窗口标题栏中绘制自定义按钮?

如何在表单标题栏中的最小化、最大化和关闭按钮旁边绘制自定义按钮?

我知道您需要使用 Win32 API 调用并覆盖 WndProc 过程,但我无法找到一个正确的解决方案。

有谁知道如何做到这一点?更具体地说,有没有人知道在 Vista 中可以做到这一点的方法?

0 投票
11 回答
17939 浏览

c++ - 存储此指针以在 WndProc 中使用的最佳方法

我很想知道存储this指针以供在WndProc. 我知道几种方法,但据我所知,每种方法都有自己的缺点。我的问题是:

产生这种代码有哪些不同的方法:

我可以想到 Thunks、HashMaps、Thread Local Storage 和 Window User Data 结构。

这些方法的优缺点是什么?

代码示例和建议获得的积分。

这纯粹是出于好奇。使用 MFC 后,我一直想知道它是如何工作的,然后开始考虑 ATL 等。

编辑:我可以HWND在窗口过程中有效使用的最早位置是什么?它被记录为WM_NCCREATE- 但如果您实际进行实验,那不是发送到窗口的第一条消息。

编辑: ATL 使用 thunk 来访问 this 指针。MFC 使用HWNDs 的哈希表查找。

0 投票
1 回答
1400 浏览

.net - 是否有一个 .NET 命名空间,我可以在其中找到与 WIN32 API 消息相关的#defines,例如 WM_COMMAND 等

我正在覆盖 WndProc,所以我想编写类似的代码

0 投票
2 回答
3220 浏览

c# - 这些 WndProc 代码是什么意思?

我正在尝试制作一个在您在外部单击时关闭的窗口,目前我正在考虑通过处理 WndProc 函数来实现这一点。

到目前为止,我收到的所有消息似乎都没有用,但有一些我根本不明白。代码 0x0118、0xC123、0xC128 和 0xC12E 代表什么?

0 投票
9 回答
102851 浏览

c# - 如何在 WPF 中处理 WndProc 消息?

在 Windows 窗体中,我只需覆盖WndProc,并在消息进入时开始处理它们。

有人可以向我展示如何在 WPF 中实现相同目标的示例吗?

0 投票
2 回答
2456 浏览

c - WNDCLASSEX的概念,良好的编程习惯和系统类的WndProc

我了解 Windows API 使用“类”,依赖于WNDCLASS / WNDCLASSEX结构。

我已经成功通过了windows API Hello World应用程序,了解到这个类被我们自己的windows使用,也被Windows核心控件使用,例如“EDIT”,“BUTTON”等。我明白它与WndProc(它允许我为它定义一个函数)

虽然我可以找到关于这个类的文档,但我找不到任何解释这个概念的东西。

到目前为止,我发现的唯一一件事是:

Window 类与 C++ 类没有任何关系。

真的没有帮助(它告诉我它不是什么但不告诉我它什么)。事实上,这只会让我更加困惑,因为我很想将 WNDCLASSEX 与 C++ 类相关联,并认为“WNDCLASSEX”代表一种控制类型 。所以,我的第一个问题是它是什么?

其次,我知道可以在类中定义 WndProc。但是,窗口也可以从子控件(或窗口,或在 Windows API 中调用的任何内容)获取消息。怎么会这样?

最后,什么时候定义一个新类是一个好的编程习惯?每个应用程序(对于主框架)、每个框架、每个我定义的控件(例如,如果我创建自己的进度条类)?

我知道 Java/Swing、C#/Windows.Form、C/GTK+ 和 C++/wxWidgets,所以我可能会理解与这些工具包的比较。

0 投票
2 回答
1370 浏览

c++ - Win32 中的 WM_NOTIFY 和超类链接问题

作为参考,我正在使用本文中概述的窗口超类方法。如果我想处理WM_NOTIFY来自超类中的基本控件的消息(即用于自定义绘图),则会出现特定问题,我要么需要将它们从父窗口反映回来,要么将我自己的窗口设置为父窗口(在 CREATESTRUCT 内部传递WM_(NC)CREATE给基班级)。如果我有一个超类,则此方法可以正常工作。如果我超类我的超类,那么我会遇到问题。现在 3 个 WindowProcs 在同一个 HWND 中运行,当我反映WM_NOTIFY消息(或将它们从上面的父技巧发送给我自己)它们总是转到最外层(最派生的)WindowProc。我无法判断它们是针对内部超类的消息(基本消息应该发送到第一个超类)还是针对外部超类的消息(来自内部超类的消息针对外部超类)。这些消息无法区分,因为它们都来自具有相同控制 ID 的同一个 HWND。有没有办法在不创建新窗口来封装每个继承级别的情况下解决这个问题?

对不起,文字墙。这是一个很难解释的概念。这是一个图表。

单个超类:

超类的超类:

第二种情况下的WM_NOTIFY消息都来自相同的 HWND 和控制 ID,因此我无法区分用于 SuperA(来自 Base)的消息和用于 SuperB(来自 SuperA)的消息。有任何想法吗?

0 投票
5 回答
4344 浏览

c# - 没有可见形式的 WndProc?

我想在第二个线程上创建一个表单,它将在它的 WndProc 方法中接收消息。创建这样的不可见表单的推荐方法是什么?设置“ShowInTaskbar=false”和“Visible=false”是否足够,或者是否有“更清洁”的方式?

0 投票
2 回答
1583 浏览

c# - 如何获取窗口中“X”按钮的坐标?

出于某种原因,我需要检测用户何时实际单击了 X 按钮。我到目前为止是这样的:

基本上,我会注意“WM_NCLBUTTONDOWN”消息,即鼠标单击窗口的非客户区。然后,我从 LParam 获取 X 和 Y 坐标,最后将其转换为屏幕坐标。所以在这一点上,我知道用户点击了非客户区,我知道表单上的位置。

我的问题是,如何判断这些坐标是否在 X 按钮上。目前,我正在对 680 进行硬编码,因为这适用于当前窗口大小(它不是很大),但问题是我使用的是 Windows 7,它的 X 按钮比 XP 大,所以显然硬编码是不可行的选项。此外,我什至没有为 Y 坐标编码,所以如果有人点击窗口的右边缘,也会触发该代码。所以...有人有什么想法吗?

0 投票
1 回答
641 浏览

c# - 可拖动的 WinForm 问题

我有一个 Windows 窗体,可以通过单击并拖动窗体的任何部分来移动它。我使用了覆盖 WndProc 的方法,并将 NCHITTEST 函数的结果设置为 HTCAPTION,以使表单误以为我单击了标题-因此它可以拖动。

此代码效果很好,如下所示:

当我将 ToolStripPanel 停靠在表单中时会出现问题(这充当可拖动的工具栏)。我需要 ToolStrip 未覆盖的 ToolStripPanel 的任何部分来传递使整个表单进入拖动模式所需的消息。

我创建了自己的 ToolStripContainer 类来覆盖 WndProc 函数,并尝试使用与上述相同的函数,但它导致 ToolStripContainer在表单进入拖动模式,这不是所需的功能。

我还尝试将 NCHITTEST 消息传递给父级,以及使用当前鼠标坐标构造一条新消息,并使用 WinAPI 和父级的窗口句柄将其发送给父级。

我必须在这里遗漏一些简单的东西......有人有什么想法吗?