【发布时间】:2019-12-12 07:25:19
【问题描述】:
我已经设法将一个按钮添加到另一个应用程序,在本例中,它是用于测试目的的记事本。
var w1 = NativeMethods.GetShellWindow();
if (w1 != IntPtr.Zero)
{
var hWndNotepad = TopLevelWindowUtils.FindWindow(wh => wh.GetWindowText().Contains("Notepad"));
IntPtr hWndEdit = NativeMethods.FindWindowEx(hWndNotepad.RawPtr, IntPtr.Zero, "Edit", null);
var button = new Button { Text = "Click Me!", Left = 5, Top = 5, Width = 75, Height = 75 };
button.Click += (o, args) => { MessageBox.Show("You've clicked me"); };
NativeMethods.SetParent(button.Handle, hWndEdit);
btHandle = button.Handle;
btns.Add(button);
Timer timer = new Timer();
timer.Interval = (1 * 1000); // 10 secs
timer.Tick += Timer_Tick;
timer.Start();
}
这很好,我在记事本中看到了按钮:
但是,当我失去窗口焦点、最小化等时,按钮就会消失。我如何保留它?
我尝试在计时器上发送消息以重新绘制,但它不起作用:
private void Timer_Tick(object sender, EventArgs e)
{
var w1 = NativeMethods.GetShellWindow();
if (w1 != IntPtr.Zero)
{
var hWndNotepad = TopLevelWindowUtils.FindWindow(wh => wh.GetWindowText().Contains("Notepad"));
IntPtr hWndEdit = NativeMethods.FindWindowEx(hWndNotepad.RawPtr, IntPtr.Zero, "Edit", null);
NativeMethods.SendMessage(btHandle, NativeMethods.WM_PAINT, IntPtr.Zero, IntPtr.Zero);
}
}
你能帮忙吗?
PS。我试图将其作为 Windows 服务运行,以便在服务运行时,它始终在其他应用程序中具有按钮 - 在本例中为记事本。
【问题讨论】:
-
我们可以提供帮助,但这不是您想要的帮助:这无法可靠地完成。
-
当然从服务进程中获得零机会,在会话 0 中隔离运行。但即使是用户桌面上的进程也无法可靠地实现这一点。无论您的问题是什么,这都不是解决方案。
-
按钮不应在编辑框中创建,即使您拥有该进程。编辑框想要在该区域进行绘制。我不知道您的目标是什么,也许您想从头开始编写自己的简单记事本程序,带有工具栏按钮,必须有可用的示例 .net 示例。
-
@BarmakShemirani 这只是测试解决方案
-
你可以看一下这个例子stackoverflow.com/a/36455629/4603670,它在标题栏中添加了一个按钮(不是标准按钮类)。虽然我个人不会尝试该代码,但它会出现太多问题并且可能导致其他进程崩溃。我建议找到一个更标准的解决方案,例如使用托盘图标等。