【问题标题】:How do I start C# program without the window being active?如何在不激活窗口的情况下启动 C# 程序?
【发布时间】:2019-01-03 06:03:05
【问题描述】:

我正在尝试创建一个 C# 程序,但我不希望窗口在打开时处于活动状态。我希望它在后台打开,并且窗口显示在我的其他程序之上,除了我希望我的活动窗口保持不变。这是因为我正在使用全屏程序,并且我不希望我的小弹出窗口让我退出全屏模式。

程序使用(可能有助于理解我需要什么):我正在创建一组宏,可以将备用鼠标变成媒体控制器。滚轮控制音量,左键控制播放/暂停等。我使用 Spotify 播放音乐,我希望能够独立于计算机的全局音量来更改 Spotify 的音量。我已经使用代码here 解决了这个问题。我希望显示一个弹出窗口,告诉我当我使用滚轮时,我正在更改 Spotify 的音量,而不是全局音量。我希望能够激活宏,显示弹出窗口,根据需要更改音量,然后在不退出全屏应用程序的情况下停用宏。希望对您有所帮助,谢谢!

程序使用编辑:这里只是一个解释视频,应该比试图解释更容易。澄清一下,我希望程序在启动时不要更改已激活的窗口,并且始终处于最顶层,而无需我先激活它。谢谢!!! https://streamable.com/2pewz

我正在使用一个名为 QuickMacros 的程序来打开弹出窗口,我在其中尝试了一些不同的设置,但都没有成功。我对 C# 没有任何经验,所以我没有在 C# 中尝试过任何东西。

我的代码与问题无关,但在这里以防万一。所有这一切都让我能够移动弹出窗口。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SpotifyPopup
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {

    }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                this.Left += e.X - lastPoint.X;
                this.Top += e.Y - lastPoint.Y;
            }
        }
        Point lastPoint;
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            lastPoint = new Point(e.X, e.Y);
        }

        private void label1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                this.Left += e.X - lastPoint2.X;
                this.Top += e.Y - lastPoint2.Y;
            }
        }
        Point lastPoint2;
        private void label1_MouseDown(object sender, MouseEventArgs e)
        {
            lastPoint2 = new Point(e.X, e.Y);
        }
    }

        } 

感谢您的帮助!

【问题讨论】:

    标签: c# window active-window


    【解决方案1】:

    你的问题有点不清楚,但如果我是对的,你想要的是以最小化状态启动应用程序,只需在表单构造函数中使用下面的代码

    this.WindowState = FormWindowState.Minimized;
    

    当您的事件被触发并且您希望您的应用程序处于顶部时,只需使用

    this.TopMost = true;
    this.WindowState = FormWindowState.Normal;
    

    为了正确定位表单,您可以使用this answer

    编辑

    好的,现在您的需求更清楚了,这是我认为您想要的演示,在此示例中,表单开始最小化并在鼠标滚轮上到达顶部,然后在空闲时进入后台,您可以添加更多事件编码并根据您的需要进行调整,
    感谢this link,我在这个演示中使用了全局挂钩,所以不要忘记根据提供的链接添加正确的 nuget 包。
    这是代码:

    using Gma.System.MouseKeyHook;
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    public class Form1 : System.Windows.Forms.Form
    {
        private Timer timer;
        private IKeyboardMouseEvents m_GlobalHook;
    
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }
    
        public Form1()
        {
            Subscribe();
    
            timer = new Timer();
            timer.Interval = 1000;
            timer.Tick += Timer_Tick;
    
            // Set up how the form should be displayed.
            ClientSize = new System.Drawing.Size(292, 266);
            Text = "Notify Icon Example";
    
            WindowState = FormWindowState.Minimized;
    
            Rectangle workingArea = Screen.GetWorkingArea(this);
            Location = new Point(workingArea.Right - Size.Width - 100,
                                      workingArea.Bottom - Size.Height - 100);
        }
    
        private void Timer_Tick(object sender, EventArgs e)
        {
            WindowState = FormWindowState.Minimized;
            TopMost = false;
        }
    
        public void Subscribe()
        {
            // Note: for the application hook, use the Hook.AppEvents() instead
            m_GlobalHook = Hook.GlobalEvents();
    
            m_GlobalHook.MouseWheel += M_GlobalHook_MouseWheel;
        }
    
        private void M_GlobalHook_MouseWheel(object sender, MouseEventArgs e)
        {
            WindowState = FormWindowState.Normal;
            TopMost = true;
            timer.Stop();
            timer.Start();
        }
    
        public void Unsubscribe()
        {
            m_GlobalHook.MouseDownExt -= M_GlobalHook_MouseWheel;
    
            //It is recommened to dispose it
            m_GlobalHook.Dispose();
        }
    
    }
    

    【讨论】:

    • 感谢您的回复!我对最小化的窗口状态有一些运气,但最上面的部分似乎不起作用。窗口启动时最小化,但在单击之前不会显示任何内容。
    • @KPopOG,我编辑了我的答案,看看是否有帮助。
    • 有点......让我在我原来的帖子中添加一些关于项目目标的上下文,这可能会更有帮助。我不想添加太多不必要的阅读内容,但可能会对您有所帮助。
    • 好了,我说完了。添加更多信息,希望它有用。谢谢!
    • 我一直在搞乱你的建议,但没有运气。还有其他想法吗?
    【解决方案2】:

    看看这里:Bring a window to the front in WPF

    本主题讨论了使用 WPF 呈现、激活和显示窗口的一般机制。

    【讨论】:

    • OP 说的是 winforms,而不是 WPF
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2011-01-31
    相关资源
    最近更新 更多