Tag: wndproc

WndProc没有可见的forms?

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

Clipboard.GetText会覆盖剪贴板吗?

这就是我想要做的事情:当我按下Ctrl-C时,有一些游戏会将鼠标光标下的项目信息写入剪贴板。 我试图抓住这些信息并从中选择一些我需要的东西。 我这样做: //at form load RegisterHotKey(this.Handle, 0, 0x002, (int)Keys.C); protected override void WndProc(ref Message m) { if (m.Msg == 0x0312) { int id = m.WParam.ToInt32(); if (id == 0) { System.Threading.Thread.Sleep(155); //ive thought if i add some delay it would help but it doesnt… string textFromClipboard = Clipboard.GetText(); if (textFromClipboard.Contains(“Itemlevel: “)) { // do […]

这些WndProc代码是什么意思?

我正在尝试创建一个窗口,当您在外部单击时关闭 ,此时我正在考虑通过处理WndProc函数来完成此操作。 到目前为止,我所获得的消息似乎都没有用,但有一些我根本不理解。 代码0x0118,0xC123,0xC128和0xC12E代表什么?

在窗口标题中更改光标

我有一个WinForm,现在我需要在窗口标题部分更改光标。 我有一些代码工作,它有两个问题: 它还会在边缘处更改光标(应显示正常的resize光标)。 我发现我需要这样的WM_NCHITTEST和HTTOP ,但我该如何组合呢? 移动鼠标时有一些闪烁。 我也尝试将代码放在base.WndProc(ref m); 。 这是我已有的代码: if ((m.Msg == Win32.WM.NCMOUSEMOVE || m.Msg == Win32.WM.NCLBUTTONDOWN || m.Msg == Win32.WM.NCLBUTTONUP || m.Msg == Win32.WM.NCRBUTTONDOWN || m.Msg == Win32.WM.NCRBUTTONUP) ) { if (m.WParam.ToInt32() != Win32.HT.TOP && m.WParam.ToInt32() != Win32.HT.RIGHT && m.WParam.ToInt32() != Win32.HT.BOTTOM && m.WParam.ToInt32() != Win32.HT.LEFT) { Cursor = Cursors.Hand; } } 编辑: […]

Winforms控制窃取WndProc WM_NCHITEST

我正在使用WndProc函数中的WM_NCHITEST事件在C#中构建一个表单。 它在页面上没有控件时效果很好,但当我向页面添加一个面板时,我的WndProc函数停止接收WM_NCHITEST事件。 知道我能做些什么来阻止这个吗? 更新 :我的窗口通常是无边框的,但是当我以边框模式运行它时,当光标鼠标hover在窗口框架上时,会调用WM_NCHITTEST事件,让我认为我拥有的表单大小控件(Chromium Embedded Web Browser)正在拦截消息。 任何方式从一个不正常的窗口夺回WndProc控制权? protected override void WndProc(ref Message m) { if (m.Msg == 0x0083) //WM_NCAlSIZE { if (borderless) { return; //Works even with a control on the page. } } if (m.Msg == 0x0084) //WM_NCHITEST { Debug.Print(“If there is a control on the page I won’t print :(“); } […]

我的WPF应用程序中的WndProc没有“处理”WM_INPUT事件

[编辑]这是我迄今为止收集的有关鼠标输入处理的内容。 请注意,我通过一堆不同的来源和实验学到了这一点,所以不要把它当成福音:1)鼠标事件源于鼠标移动2)SetWindowsHookEx(WH_MOUSE_LL)处理程序LowLevelMouseProc首先看事件3)OS / app框架处理鼠标事件处于某种高级别(鼠标光标移动)4)WM_INPUT事件由app事件队列拾取并由WndProc处理(尽管此时处理不会阻止鼠标光标在步骤3中移动)。 5)通过ComponentDispatcher调度消息6)触发PreviewMouseMove和MouseMove事件,并且可以由app处理。 基于此,我认为确保鼠标光标不移动的唯一方法是通过WH_MOUSE_LL进行过滤。 当然,正如我在本文前面提到的那样,目前还没有足够的信息来了解这个鼠标事件来自哪个设备,所以它是全部或全部过滤,不符合我的要求。 [编辑]我已经validation我能够通过挂钩WH_MOUSE_LL并从处理程序返回大于0的值来删除事件。 现在我只需要弄清楚如何将WH_MOUSE_LL级别生成的鼠标事件与来自我的设备的事件进行匹配… 我确实尝试从WndProc返回一个大于0的值。 该活动仍由我的应用处理。 我正在尝试集成一个基于机械USB鼠标的Y轴的旋转输入设备。 我希望此设备仅作为原始输入设备运行,并且要删除设备生成的正常鼠标移动事件(至少在我的应用程序的上下文中)。 到目前为止,我已经能够使用WindowIteropHandler和AddHook将WndProc挂钩到我的WPF应用程序MainWindow中。 我能够接收WM_INPUT事件并从我的特定USB VID / PID设备中过滤那些鼠标事件(足以满足我的需要)。 我希望将消息标记为已处理并返回0将导致消息不会传播到WPF窗口的其余部分,但事实并非如此……当我移动设备时,我仍然收到MouseMove事件。 这是我的代码(简化为删除处理WM_INPUT消息,但仍然表现出相同的问题): public partial class MainWindow : Window { private const int WM_INPUT = 0x00FF; public MainWindow() { InitializeComponent(); } public IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { if (msg == […]

C#表单控件移动

反正有控制你可以移动表格的地方吗? 因此,如果我移动一个表格,它只能在垂直轴上移动,当我尝试水平移动时,没有任何反应。 我不想要像changechanged或move事件那样的bug实现并将其弹回内联。 我没有办法使用类似WndProc覆盖的东西,但在搜索了一段时间后,我找不到任何东西。 请帮忙

WPF:如何使自定义模式对话框闪烁?

通常,当您打开modal dialog并尝试单击它的父窗口时,modal dialog的标题栏会闪烁。 在WPF中创建自定义,无边框,无边框的窗口时,您将失去所有这些function,并且必须自己重建它。 我看起来高低,因为我的生活无法弄清楚如何让我的模态窗口闪烁。 虽然它仍然会发出哔哔声…… 我想我将不得不在WndProc中观察一些我必须处理的事件,但我无法弄清楚哪个事件或如何做到这一点。 我已经尝试观察窗口更改和窗口更改事件以及WM_ACTIVATE事件无济于事。 我确定我只是遗漏了一些简单的东西,但我会很感激你的帮助。 谢谢!

WM_NCLBUTTONUP消息在拖动表单结尾时没有发送,怎么办?

编辑: tl;博士去第一条评论。 这个问题源于另一个问题, 当鼠标在表格边框上出现时 ,我的获取MouseDown事件? 在那个问题中,当用户在表单边框上按下鼠标左键(准备拖动)时,我需要有一个表单触发事件,这非常有效。 问题是当用户完成此操作时,通过放开鼠标左键,我还想要触发一个事件。 为此,我将此代码生成为“基本表单”类,其他表单将从中派生。 我已经删除了FireMouseButton…()方法以简洁; 他们解雇自定义事件。 const int WM_NCLBUTTONUP = 0xA2; const int WM_NCLBUTTONDWN = 0xA1; protected override void WndProc(ref Message m) { if (m.Msg == WM_NCLBUTTONUP) FireMouseButtonUp(); if (m.Msg == WM_NCLBUTTONDWN) FireMouseButtonDown(); base.WndProc(ref m); } 这样做的问题是WM_NCLBUTTONUP消息没有像我预期的那样发送。 在查看WM_NCLBUTTONUP的描述后,我可以看到为什么, 当用户在窗口的非客户区域内释放鼠标左键时,会发布[WM_NCLBUTTONUP]。 此消息将发布到包含光标的窗口中。 如果窗口捕获了鼠标,则不会发布此消息。 由于表单在拖动时捕获了鼠标,因此不会收到WM_NCLBUTTONUP消息。 (如果forms最大化的话会这样)。 这个问题解释得更好一个窗口未最大化时丢失的WM_NCLBUTTONUP消息的奇怪问题 。 这个问题的答案有点帮助,但对我来说却引起很多困惑。 在下面的代码中我有一个小的SSCCE,它实现了从上面的答案的解决方案给出的一些代码,检查WMNCHITTEST消息以查看鼠标是否已被释放; 这个想法是当鼠标在表单中移动时应该发送WM_NCHITTEST 。 因此,一旦拖动停止,此消息应在WndProc消息参数中以鼠标位置作为DragStartPoint发送; 收到WM_NCLBUTTONDOWN消息时记录DragStartPoint位置。 […]

C#:如何从表单和控件中拖出一个?

我使用以下代码通过单击并拖动表单本身来拖动无边框表单。 它可以工作,但它不适用于单击并拖动窗体上的控件。 我需要能够在单击某些控件时拖动它而不是其他控件 – 按标签拖动,但不要通过按钮和文本框拖动。 我该怎么做? protected override void WndProc(ref Message m) { base.WndProc(ref m); const int WM_NCHITTEST = 0x84; const int HTCLIENT = 0x1; const int HTCAPTION = 0x2; if (m.Msg == WM_NCHITTEST && (int)m.Result == HTCLIENT) m.Result = (IntPtr)HTCAPTION; }