如何在其他应用程序中关闭1个应用程序的形式?

时间:2017-04-19 07:34:48

标签: c# winforms

应用程序A(例如:AutoCAD,Word,...)运行时,它会在运行时调用DLL X来执行任务→打开表单登录

应用程序B(例如:Photoshop,Excel ...)运行时,它会在运行时调用DLL Y执行任务→我想关闭上面的登录表单可以做到这一点吗?

这可能吗?

Image description

3 个答案:

答案 0 :(得分:0)

如果它只是关闭运行进程最简单的方法可能就像

disableKeyguard()

打开你可能会循环所需名称的过程。它的效率不是很高,但如果它只是在你之后开启和关闭,它就能完成任务。

答案 1 :(得分:0)

您可以使用(仅示例)无窗口控制台应用程序继续检查新进程。我有一个例子:

  1. 使用控制台应用程序和登录表单

  2. 创建一个新项目
  3. 使控制台应用程序成为这样的Windows应用程序:

  4. enter image description here
      按属性 enter image description here   选择Windows应用程序

    在控制台应用程序中创建一个检查进程的计时器:

    public static bool IsOpen = false;
    
    static void Main(string[] args)
    {
        Timer t = new Timer(TimerCallback, null, 0, 1200);
        while ( true )
        {
            //keep it running
        }
    }
    
    private static void TimerCallback(Object o)
    {
        if ( !IsOpen && Process.GetProcesses().Select( r => r.ProcessName ).Contains( "EXCEL" ) )
        {
            //Excel is running, show the form
            Form1 loginForm = new Form1();
            loginForm.ShowDialog();
            //Stop it from spawning a million forms by setting bool
            IsOpen = true;
        }
    }
    

    当应用程序关闭时关闭Form的逻辑也可以放在这个计时器中,以同样的方式使用它。

    要从控制台窗口打开表单,您需要添加对控制台应用程序的引用:

    enter image description here

    如果您需要流程名称:
    只需使用表单并添加:

    foreach ( var proc in Process.GetProcesses() )
    {
        MessageBox.Show( proc.ProcessName );
    }
    

    这将显示当前正在运行的所有进程的名称。

答案 2 :(得分:0)

这是一个小样本,展示了如何在另一个进程中关闭Window。创建一个新的Windows窗体项目,在其中添加两个窗体并在第一个上添加两个按钮并将该代码放在Form1中:

public partial class Form1 : Form
{
    delegate bool EnumWindowsProc(IntPtr Hwnd, IntPtr lParam);

    [DllImport("user32", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private extern static bool EnumThreadWindows(int threadId, EnumWindowsProc callback, IntPtr lParam);

    [DllImport("user32", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);

    [DllImport("user32", SetLastError = true, CharSet = CharSet.Auto)]
    private extern static int GetWindowText(IntPtr hWnd, StringBuilder text, int maxCount);

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

    private const int WM_CLOSE = 0x10;

    public Form1()
    {
        InitializeComponent();
        button1.Click += button1_Click;
        button2.Click += button2_Click;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var frm = new Form2();
        frm.Show(this);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Process[] processes = Process.GetProcessesByName("FindWindowSample");

        foreach (Process p in processes)
        {
            var handle = FindWindowInProcess(p, x => x == "Form2");

            if (handle != IntPtr.Zero)
            {
                SendMessage(handle, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
            }
        }
    }

    public static IntPtr FindWindowInProcess(Process process, Func<string, bool> compareTitle)
    {
        IntPtr windowHandle = IntPtr.Zero;

        foreach (ProcessThread t in process.Threads)
        {
            windowHandle = FindWindowInThread(t.Id, compareTitle);
            if (windowHandle != IntPtr.Zero)
            {
                break;
            }
        }

        return windowHandle;
    }

    private static IntPtr FindWindowInThread(int threadId, Func<string, bool> compareTitle)
    {
        IntPtr windowHandle = IntPtr.Zero;
        EnumThreadWindows(threadId, (hWnd, lParam) =>
        {
            StringBuilder text = new StringBuilder(200);
            GetWindowText(hWnd, text, 200);
            if (compareTitle(text.ToString()))
            {
                windowHandle = hWnd;
                return false;
            }
            return true;
        }, IntPtr.Zero);

        return windowHandle;
    }
}

编译然后运行该应用程序的两个实例。在第一个单击Button1以显示Form2。在第二个实例上,单击Button2以从第一个实例关闭Form2。