Переключение на другое приложение (ранее активное) по нажатию кнопки в .net - PullRequest
0 голосов
/ 07 декабря 2011

Привет, я хочу сделать что-то вроде экранной клавиатуры. Я хочу, чтобы пользователь нажал кнопку на неактивном приложении, а затем нажатие клавиши будет отправлено активному приложению, при этом активное приложение будет активным. Я написал код для события зависания кнопки в неактивном приложении, и оно работает. Но я хочу сделать это в событии клика. Это не работает, потому что неактивное приложение становится активным. Код ниже для события зависания. Спасибо.


private void button1_MouseHover(object sender, EventArgs e)
{
    SendKeys.Send("{TAB}");
}

Ответы [ 2 ]

0 голосов
/ 08 декабря 2011

Наконец-то я смог найти способ сделать это. См. Код ниже.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Timers;
using tmr = System.Timers;
using System.Threading;

namespace KeyPressTest
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll")]
        static extern int GetForegroundWindow();

        [DllImport("user32")]
        private static extern UInt32 GetWindowThreadProcessId(Int32 hWnd, out Int32 lpdwProcessId);

        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern bool SetForegroundWindow(IntPtr hWnd);

        tmr.Timer tm = new tmr.Timer();
        Int32 hwnd = 0;

        private Int32 GetWindowProcessID(Int32 hwnd)
        {
            Int32 pid = 1;
            GetWindowThreadProcessId(hwnd, out pid);
            return pid;
        }     

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            tm.Elapsed += Timer_Elapsed;
            tm.Interval = 100;
            tm.Start();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SetForegroundWindow((IntPtr)hwnd);
            Thread.Sleep(40);
            SendKeys.Send("{TAB}");
        }       

        private void Timer_Elapsed(object sender, System.EventArgs args)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new MethodInvoker(delegate
                {
                    if (this.Handle.ToInt32() != GetForegroundWindow())
                    {
                        hwnd = GetForegroundWindow();
                    }
                }));
            }
            else
            {
                if (this.Handle.ToInt32() != GetForegroundWindow())
                {
                    hwnd = GetForegroundWindow();
                }
            }
            if (hwnd == 0)
            {
                return;
            }
            string appProcessName = "";
            string appExePath = "";
            string appExeName = "";
            try
            {
                appProcessName = Process.GetProcessById(GetWindowProcessID(hwnd)).ProcessName;
                appExePath = Process.GetProcessById(GetWindowProcessID(hwnd)).MainModule.FileName;
                appExeName = appExePath.Substring(appExePath.LastIndexOf(@"\") + 1);
            }
            catch (Exception ex)
            {
            }
            if (textBox1.InvokeRequired)
            {
                textBox1.Invoke(new MethodInvoker(delegate
                {
                    textBox1.Text = appProcessName + " | " + appExePath + " | " + appExeName;
                }));
            }
            else
            {
                textBox1.Text = appProcessName + " | " + appExePath + " | " + appExeName;
            }
        }
    }
}
0 голосов
/ 07 декабря 2011

Я никогда не делал ничего подобного, но вот что я нашел на этом форуме :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace WindowsApplication1
{
    public partial class Form1 : Form
{

[DllImport("user32.dll")]
static extern int GetForegroundWindow();

[DllImport("user32")]
private static extern UInt32 GetWindowThreadProcessId(Int32 hWnd, out Int32 lpdwProcessId);

private int teller = 0;

public Form1()
{
   InitializeComponent();
}

private void timer1_Tick(object sender, EventArgs e)
{
   if (teller == 1)
   {
      setTextje();
   }
   teller++;
}

private Int32 GetWindowProcessID(Int32 hwnd)
{
    Int32 pid = 1;
    GetWindowThreadProcessId(hwnd, out pid);
    return pid;
}

private void setTextje()
{
   Int32 hwnd = 0;
   hwnd = GetForegroundWindow();
   string appProcessName = Process.GetProcessById(GetWindowProcessID(hwnd)).ProcessName;
   string appExePath = Process.GetProcessById(GetWindowProcessID(hwnd)).MainModule.FileName;
   string appExeName = appExePath.Substring(appExePath.LastIndexOf(@"\") + 1);
   textBox1.Text = appProcessName + " | " + appExePath + " | " + appExeName;
}
}
}

Он не дает точного ответа на ваш вопрос, но даст подсказку. Вам нужно DllImport "User32.dll". После этого вы можете получить идентификатор окна переднего плана и поиграть с ним. Также есть очень интересная статья о отслеживании переключения приложений, написанная на C #

...