问题标签 [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 投票
0 回答
662 浏览

pinvoke - 如何将类光标设置为空?

对不起,很长的帖子!恐怕我有一些解释要做......我有一个不使用 WinForms 的应用程序(在 Unity3d 中,但用于 Windows),所以我不能使用属于 System.Windows.Forms 命名空间的 Cursor 类. 但同样,我希望能够设置光标的当前形状。

经过大量研究和谷歌搜索,我发现这可以通过对 user32.dll 中某些方法的 P/Invoke 调用来实现。我得到它(有点)工作:

使用以下命令查找窗口句柄:

并为类名提供 null,为窗口名提供窗口标题。然后使用返回的 IntPtr 调用它:

并为索引提供“-4”,以便将指针指向处理所有低级窗口消息的 WindowProc,然后使用:

生成指向我在托管代码中实现的新 WndProc 委托的本机指针。它的签名如下所示:

总之,我基本上是用托管回调覆盖本机窗口过程,然后处理所有窗口消息成为我的责任。但我对重写标准窗口过程的整个实现不感兴趣,我只想能够控制当光标在窗口上方时它绘制鼠标光标形状的方式。因此,为此,我可以使用此函数调用默认窗口 proc:

然后立即使用以下命令将光标设置为其他内容:

这类作品。:) 我说“有点”,因为我看到了一些闪烁,因为默认窗口 proc 首先将光标设置为类光标,然后立即将其设置为我想要使用的自定义光标设置光标。这种情况可以通过将类游标设置为空来补救。这样做会导致系统不绘制光标并期望应用程序为每个窗口消息设置光标,而这正是我正在做的事情,所以它会阻止他们争夺谁来设置光标并消除闪烁。这记录在 MSDN 上:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms648393%28v=vs.85%29.aspx

他们解释说必​​须将类光标设置为空。但这就是我的知识不足的地方。:( 类光标是使用 SetClassLong 设置的,如上面的文章中所述。

但是游标的新值的数据类型是 IntPtr。此数据类型不可为空,如果我传入 null,编译器会抱怨,并且传入 IntPtr.zero 不起作用。那么我该如何完成文章的建议呢?如何使用 P/Invoke 将类光标设置为空?

0 投票
1 回答
2558 浏览

.net - 是否有类似 Spy++ 的用于 .NET 应用程序的程序?

我环顾四周,没有找到适合我需要的东西。我希望该程序能够拦截发送到我自己的应用程序的 Win32 (?) 消息,该应用程序是用 Visual Basic 编写的。

作为旁注,“拦截 Win32 消息”是正确的措辞吗?

无论哪种方式,精心制作都不会受到伤害。我希望 spy 工具能够截获与 WndProc 以编程方式截获的相同消息,即:SendMessages 和 PostMessages。

我想明确表示我不是在寻找拦截 .NET 框架事件的程序。

谢谢。

编辑:我可以看到我的窗口及其子控件的句柄,但我没有收到任何消息。我正在使用 Windows 7 64 位。我的 Spy++ 版本是 8.00.50727

半解决;我有一个 Spy++ 替代品(Window Detective)可以在我的虚拟机上工作,我对此非常满意,并且绝对不会介意安顿下来。

尽管我仍然想知道为什么我发现的所有“类似间谍”的程序都不能在我的“主”PC 上运行……但我想我不必在意。

0 投票
1 回答
1274 浏览

c# - 在无窗口 C# 进程中处理 WM_ 事件

我已经四处寻找了很长一段时间,似乎无法找到一个好的方法来做到这一点。

基本上我有一个使用 WPF(没有可见窗口)的 C# 进程,我需要在其中处理 WM_ 事件(例如;这样当用户选择注销或重新启动他们的机器时,我可以优雅地关闭)WM_CLOSEWM_DESTROY

我在那里看到了许多解决方案,建议使用System.Windows.InteropServicesto callAddHook并为其提供一个指向函数的指针,该函数随后变为WndProc. 问题在于,据我所知,它取决于实际可见的窗口(在这种情况下没有窗口)。

建议但不起作用的另一种方法是覆盖WndProcWinForm 的方法,但此过程没有可见的窗体或窗口。

我还发现了有关仅消息窗口的内容。某种仍然接收 WM_ 事件的不可见窗口。据我所知,这仅在Microsoft.WindowsCE.Forms程序集中可用。我在我的项目中添加了对该程序集的引用并将 MessageWindow 子类化,如下所示:http: //msdn.microsoft.com/en-us/library/microsoft.windowsce.forms.messagewindow.aspx但它似乎仍然不起作用。WndProc 内的断点没有被命中。

有什么线索吗?

0 投票
1 回答
2301 浏览

winapi - 如何子类化 win32 控件并保持与旧版本 comctl32.dll 的兼容性?

6.0 版的通用控件 (comctl32.dll) 实现了一种新方法,用于子类化控件,这在旧版本的 Windows 上不可用。实现子类化以便它在支持任一版本的通用控件库的系统上工作的最佳方法是什么?

0 投票
1 回答
1397 浏览

python - 挂钩到另一个应用程序的 wndproc?

我有一个小问题希望有人能帮助我。有没有办法连接到其他应用程序WNDPROC

情况是我想在另一个应用程序菜单栏中插入一个菜单,并且我想为每个菜单项定义命令。

我能够使用一些 Win32 API 函数 (user32.dll) 插入带有菜单项的菜单,但我无法设置该菜单项的命令,以便在单击时它实际上会执行某些操作。

通过一些谷歌搜索,我得到了一些关于 wndprocess 的信息,我应该拦截发送的 ID 命令并触发一些功能,但我被卡住了。

谁能帮我?

0 投票
1 回答
1948 浏览

c# - C# MDI - 当 MDIChild 超出范围时,在 MDI 调整大小后隐藏 MDI 滚动条

我有一个 MDI Parent ( Form1 ) 和一个 MDI Child ( Form2 )。当Form2超出 Form1 的边界,我目前已禁用 Form1 的滚动条,方法是Form2 中放置以下代码:

当用户将Form2拖出Form1的范围时, Form1的滚动条将不会显示Form2是否超出范围。但是,如果用户将Form1的大小调整Form2超出范围的位置,它将显示滚动条。

我该如何解决它,以免发生这种情况

0 投票
2 回答
696 浏览

.net - 当我有表单事件时,为什么要使用 WndProc?

WndProc我有一个关于在我的表单应用程序中使用的基本问题。WndProc当我有可用的表单事件时,我想知道该方法的用途。在哪些情况下我需要创建自定义消息?MSDN告诉它仅用于处理 Windows 消息。

0 投票
2 回答
1902 浏览

java - 用 JNA 替换 WndProc 失败并出现异常

我尝试使用 JNA 在 Java 程序中捕获 Windows 消息,以注入我自己的 WndProc 方法。由于我只对几种消息类型感兴趣,因此我必须将这些消息转发到之前的 WndProc。在我的测试中(Java 1.7.0_03,64 位,在 Windows 7 上),只要我将鼠标移到创建的窗口上,这个转发似乎就会失败,给我以下异常:

我认为这很奇怪,因为我尝试访问什么文件?我想某些内存访问出现了完全错误的情况...... :(

我正在使用最新版本的 JNA,3.4.0。我在此处或 Internet 上的其他地方找到的许多代码示例似乎使用 JNA 3.2.x(拆分为 jna.jar 和 platform.jar 之前的任何版本),其中 User32 定义了一些非常适合此类工作的方法。在较新版本的 JNA/platform 中,缺少这些方法。这就是为什么我自己定义大部分类型,只使用 jna.jar,而不是 platform.jar。以下是我用来测试的代码,它会生成异常。知道出了什么问题以及为什么会发生异常吗?

任何帮助表示赞赏,谢谢!

0 投票
1 回答
1563 浏览

c# - 使用 MVVM 模型时如何在 WPF 中使用 WndProc?

谁能帮帮我吗?我想在 WPF 中使用 WndProc,但我不想在 MainWindow.xaml.cs 中使用它,如下所示:

我想在不同的课程中使用它,原因是 uEye 相机通过消息进行通信,我需要“捕捉”它们。因为我使用的是主视图 ViewModel 模型,所以我不想在 MainWindow.xaml.cs 中输入代码。

0 投票
1 回答
10392 浏览

c++ - 通过 PostMessage 发送/接收字符串

尽管网上已经有一些资源可以解决这个粗略的话题,但我仍然没有找到适合我的答案。

我希望在我的VB.net进程和我的C++进程之间进行充分的通信。我希望能够在 C++ 进程之间发送一个字符串但目前我需要实现:

将字符串发送C++进程并进行处理。

这造成了一些我不确定的点,但我会尽量保持简单......

在VB中使用以下函数声明;

并像这样发送消息;

使用以下方法声明在C++中捕获消息;

并测试我是否可以使用以下方法访问字符串;


我浏览了很多我认为不必要的细节,但是问一下,它就会给你。

我的问题是消息已被接收并“处理”......但是由 C++ 进程创建的消息框不包含我的测试消息(它显示为:“已接收:”)。

那么,如何通过 PostMessage/SendMessage 从 VB 向 C++ 发送字符串?




解决方案:

请参阅解决方案的公认答案......但此外,这是我接收字符串的方式(C++):


最后,我在这里使用了 IPC 示例发送消息。此示例使用 C# 发送消息,但我只需要这个概念(更不用说将此类代码转换为 VB 是在公园散步)。请注意,在我的 VB 实现中,我不需要用空字符终止字符串。