如何在不激活窗口的情况下启动C#程序?

时间:2019-01-03 06:03:05

标签: c# window active-window

我正在尝试创建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);
        }
    }

        } 

谢谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您的问题尚不清楚,但是如果我是对的,那么您想要以最小化状态启动应用程序,只需在表单构造函数中使用以下代码即可做到这一点

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();
    }

}

答案 1 :(得分:-2)

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

该线程讨论了使用WPF呈现,激活和显示窗口的一般机制。