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

c# - WinForms:从 WndProc 方法(Form 类)打开一个消息框

我想象在另一个线程而不是主 UI 线程上调用 WndProc。

我是对的,所以我认为只需在表单上使用 InvokeRequired 和 Invoke 就足以在 UI 线程上显示一个消息框。

我错了。我不明白为什么。

我该如何解决这个问题?我环顾谷歌,但没有找到解决方案。

我要做的只是在剪贴板更改时引发自定义事件(ClipboardUpdate)

消息框只是一个测试但没有工作,而只是更改字符串(表单的私有字段)之类的东西是有效的,但这种行为不是一件好事,因为它是以不安全的方式进行跨线程操作。

更新1:

我这里没有代码,因为我是在朋友的计算机上创建的,但是我可以准确地解释我写的内容,因为很短。我用visual studio创建了一个基本的winform,没有任何东西。我使用了 AddClipboardFormatListener (互操作,但它作为一个函数很容易,返回 int 并接受 IntPtr)函数(在 Windows 7 操作系统上)只检测 WM_CLIPBOARDUPDATE 消息,在 winproc 内(一个简单的 if,*if (e.Msg == ClipboardExtension .WM_CLIPBOARDUPDATE) DoClipboardUpdate();*)。

现在 DoClipboardUpdate 这样做:

很容易吧?OnClipboardUpdate 只是这样做:

ClipboardUpdate 是这样声明的事件:

最后,订阅 ClipboardUpdate 事件的唯一方法里面有这个:

当我运行代码时会发生什么?该事件被触发(我尝试了一个异常并且它有效)并且消息框没有弹出,但是我不能再与我的表单交互,因为它的行为就像打开了一个弹出窗口(这是“正常”行为时你在不同的线程上打开一个弹出窗口,这就是我这么说的原因)。

关于如何解决这个问题的任何建议?

0 投票
1 回答
188 浏览

oop - 这个 OO win32API 示例是否适用于多个窗口?

我主要关注这个例子如何使用 wndproc 作为朋友...我有点困惑它是如何工作的,我只是想弄清楚这是否以及如何在多个窗口中工作

http://www.uta.fi/~jl/pguibook/api2oo.html

0 投票
1 回答
1587 浏览

c# - 在 NativeWindow 中处理 WM_GETOBJECT 返回一个 IOleCommandTarget

我正在尝试从面板控制句柄中检索 IOleCommandTarget 引用,以便可以在其上调用 IOleCommandTarget.Exec() 。

在我的 NativeMethods.cs 中:

为了能够返回 IOleCommandTarget 引用,我创建了一个实现 NativeWindow 和 IOleCommandTarget 的 CommandTargetWindow 类,并且我重写了 WndProc 以拦截 AccessibleObjectFromWindow() 发送的 WM_GETOBJECT 消息:

问题是,正如上面的评论,我如何通过消息传回 IOleCommandTarget ?

我们通过实现接口 IRawElementProviderSimple(而不是 IOleCommandTarget)并使用定义的静态方法 AutomationInteropProvider.ReturnRawElementProvider(),在其他地方为自动化目的做类似的事情:

有任何想法吗?

0 投票
1 回答
1165 浏览

c# - 更改窗口标题中的光标

我有一个 WinForm,现在我需要在光标位于 windows 标题部分时更改光标。我有一些代码工作,它有两个问题:

  1. 它还会在边缘更改光标(应显示正常调整大小的光标)。我发现我需要这样的东西WM_NCHITTEST& HTTOP,但我该如何结合呢?
  2. 移动鼠标时有一些闪烁。

我还尝试将代码放在base.WndProc(ref m);.

这是我已经拥有的代码:

编辑:
我没有在 Spy++ 中正确记录消息。找到了窗口边缘的解决方案(请参阅更新的代码)。

恩克斯,J

0 投票
1 回答
1950 浏览

c# - 如何将对象实例发送到 WndProc

我正在使用描述一些状态和值的自定义类:

由于应用程序架构,表单交互使用消息及其基础结构(SendMessage/PostMessage、WndProc)。问题是 - 如何使用 SendMessage/PostMessage 将 MyClass 的实例发送到 WndProc?在我的代码中,PostMessage 的定义如下:

所以,我需要在我的自定义消息编号下方以某种方式发送和一个 MyClass 实例,所以在 WndProc 中我可以将它用于逻辑需求。这是可能的?

0 投票
0 回答
225 浏览

c# - 使用消息在 2 个进程之间进行通信

从这里开始,但问题仍未结束-我认为我需要修改整个架构-所以请发表您的意见...

以下是应用程序的工作方式:调度程序多次执行同一个应用程序,但使用不同的参数。如果应用程序在没有任何参数或参数的情况下启动 - 它会显示一个允许编辑一些配置数据的表单。尽管有多次执行,但应该只有一个应用程序实例。

我的方法 - 对于单实例,我将 Mutex 与 ApplicationContext 和 NativeWindow 一起使用。这里描述了 我无法克服的事情 - 当启动一个新的应用程序实例时 - 如果这个实例是用参数启动的 - 如何将数据 - 参数 - 发送到正在运行的应用程序实例?我尝试使用消息发送数据 - SendMessage/PostMessage - 但没有成功。

也许有人可以提供另一种方法?

0 投票
1 回答
5686 浏览

winapi - Win32在父窗口中捕获子窗口消息

在我的 Win32 应用程序中,子窗口是由第三方 SDK 创建的。窗口创建过程是透明的,我无法将 WndProc 方法与子窗口关联。我希望能够在父窗口中捕获子窗口消息。我怎样才能做到这一点?任何帮助将不胜感激。

0 投票
3 回答
2337 浏览

c# - WPF:在没有“程序员”干预的情况下关闭应用程序关闭辅助窗口

在标题中很难解释这一点,如果有人想更改它就可以了。

我有一种情况,在 WPF 中,我创建了一个对程序员透明的“隐藏”窗口。我的意思是这个窗口是在静态构造函数中创建的,隐藏并移动到屏幕之外,它的宽度和高度为 0。这是因为我正在使用这个窗口来执行一些互操作操作并允许所有的处理程序有人可能需要的 WndProcs 覆盖(有一个委托列表处理应该覆盖 WndProc 的方法)。

希望您理解我所说的(这并不容易),我的问题是,当我创建一个 WPF 项目并启动它时,如果我关闭主窗口(这不是对程序员透明地创建的窗口),我希望我的应用程序关闭。但是,使用我创建的代码不会发生这种情况,除非我使用 Application.Current.Shutdown();

有没有办法在不调用该方法的情况下解决这个问题?我想要一种透明的方式,其他程序员甚至不应该注意到(它是一个库,不应该以这种方式改变工作程序的行为)。

感谢您的任何建议,在这里您可以看到一些代码片段:

lib创建的窗口

使用 wpf 创建的普通窗口(从项目创建的基本窗口)

更新1:

为了回答你的答案,不,我想避免程序员使用我的库进行任何干预,所以理想的解决方案是在我的库中订阅一些 Application.Exit 事件并关闭我的窗口,显然我不能使用 Application。退出,因为应用程序由于我的窗口未关闭而未关闭

也许有一种方法可以计算属于应用程序的所有窗口?我也可以用它做点什么

0 投票
3 回答
13546 浏览

c# - WndProc:最小化表单时如何获取窗口消息

要与某个服务通信,我必须覆盖WindProc. 并接收窗口消息。

但是,当表单最小化时,我不再收到任何消息。我知道它必须是这样的,但是有解决方法吗?我不想有一个始终保持打开状态的隐藏表单...

0 投票
1 回答
2694 浏览

window - DispatchMessage 如何决定使用哪个 WndProc?

我正在浏览一个开源项目的一些代码,这是我第一次处理 Win32 应用程序(主要是做控制台的东西)。我看到代码中的几个函数是 Windows 过程,因为它们返回 LRESULT CALLBACK。

程序员是否需要做一些事情来确保 DispatchMessage 调用正确的 WndProc 或者 DispatchMessage 的编码方式使其可以自行确定正确的 WndProc?


编辑:

我猜测 DispatchMessage(const MSG*) 在应用程序中的不同 WndProc 之间进行选择的方式是基于传递给它的 MSG 对象的窗口句柄成员 (HWND)。[希望前面的句子不会太混乱。] 如果例如,消息是针对应用程序的编辑窗口的(而不是针对其主窗口的),那么 DispatchMessage 将为编辑窗口作为其对象的特定类选择 WndProc 成员函数。如果消息是针对主窗口的,那么它将为主窗口作为对象的类选择 WndProc 成员函数(对我来说,这个类将是 Notepad_plus_Window 类)。不过,这只是一个想法。我没有找到太多的支持,所以如果有人能证实这一点,我会很高兴。