如何只获取新打开的镀铬窗口而不是整个镀铬窗口的所有进程的所有句柄? [英] How to get all handles of all processes of only a newly opened chrome window and not of whole chrome windows?

查看:77
本文介绍了如何只获取新打开的镀铬窗口而不是整个镀铬窗口的所有进程的所有句柄?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嗨朋友们,



当我按下自定义键时,我正在制作一个exe文件,运行后会创建一个带谷歌翻译的新Chrome窗口在其中的网站标签中,我想只将此窗口置于前面,并将焦点设置在其文本框上,供用户开始输入。



我也可以代替打开Chrome窗口,其中只有谷歌翻译,所以我不创建一个新窗口,但只带来这个窗口,而不是所有的Chrome窗口都在前面,并专注于它的文本框。



我尝试了什么:



  static  List< Process>升; 

/// < 摘要 >
/// 应用程序的主要入口点。
/// < / summary >
[STAThread]
static void Main()
{
ProcessStartInfo prs = new ProcessStartInfo( chrome.exe);
prs.Arguments = http://translate.google.com + --new-window;
prs.WindowStyle = ProcessWindowStyle.Normal;
列表<流程> processesBeforeNewChrome = Process.GetProcessesByName( chrome)。ToList();
Process.Start(prs);
System.Threading.Thread.Sleep( 100 );
列表<流程> processesAfterLaunchingChrome = Process.GetProcessesByName( chrome)。ToList();

l = new List< Process>();
for int i = 0 ; i < processesAfterLaunchingChrome.Count; i ++)
{
for int k = 0 ; k < processesBeforeNewChrome.Count; k ++)
{
if (processesAfterLaunchingChrome [i] .Id == processesBeforeNewChrome [k] .Id)
{
goto skip;
}
}
l.Add(processesAfterLaunchingChrome [i]);
跳过:;
}


foreach (处理p l)
{
ShowWindow(p.MainWindowHandle,SW_RESTORE);
}


foreach (处理p l)
{
ShowWindow(p.MainWindowHandle,SW_MINIMIZE);
}

foreach (处理p in l)
{
ShowWindow(p.MainWindowHandle,SW_RESTORE);
SetWindowPos(p.MainWindowHandle,HWND_TOPMOST, 0 0 0 0 ,SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
BringWindowToTop(p.MainWindowHandle);
SetForegroundWindow(p.MainWindowHandle);
}

foreach (处理p in l)
{
SetWindowPos(p.MainWindowHandle,HWND_TOP, 0 0 0 0 ,SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
SetWindowPos(p.MainWindowHandle,HWND_NOTOPMOST, 0 0 0 0 ,SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
}

foreach (处理p in l)
{
ShowWindow(p.MainWindowHandle,SW_RESTORE);
BringWindowToTop(p.MainWindowHandle);
SetFocus( new HandleRef( null ,p.MainWindowHandle));
}

foreach (处理p in l)
{
SetForegroundWindow(p.MainWindowHandle);
}

gkh.HookedKeys.Add(Keys.Escape);
gkh.KeyDown + = Gkh_KeyDown;

Application.Run();
}

private static void Gkh_KeyDown( object sender,KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
{
foreach (处理p in l)
{
try
{
ShowWindow(p.MainWindowHandle,SW_MINIMIZE);
}
catch {}
}
System.Diagnostics.Process.GetCurrentProcess()。Kill();
}
}

静态 globalKeyboardHook gkh = new globalKeyboardHook();

解决方案

这与您之前的问题有何不同:如何获取流程的所有句柄? [ ^ ]



阅读评论,阅读答案。事情没有改变,因为你不喜欢你被告知的事情......


很久以前就提出了一个类似的问题,也许你可以找到一些有用的东西:从Chrome到C#表单应用程序获取已打开的URL [ ^

Hi friends,

I'm making an exe file to be run when I press a custom key, that when run creates a new Chrome window with Google Translate website tab in it, I want to bring only this window to front and set focus on its textbox for the user to start typing.

I could also instead look for an open Chrome window with only Google Translate in it so I don't create a new window but bring only this window and not all Chrome windows to front and focus on its textbox.

What I have tried:

static List<Process> l;

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            ProcessStartInfo prs = new ProcessStartInfo("chrome.exe");
            prs.Arguments = "http://translate.google.com" + " --new-window";
            prs.WindowStyle = ProcessWindowStyle.Normal;
            List<Process> processesBeforeNewChrome = Process.GetProcessesByName("chrome").ToList();
            Process.Start(prs);
            System.Threading.Thread.Sleep(100);
            List<Process> processesAfterLaunchingChrome = Process.GetProcessesByName("chrome").ToList();

            l = new List<Process>();
            for (int i = 0; i < processesAfterLaunchingChrome.Count; i++)
            {
                for (int k = 0; k < processesBeforeNewChrome.Count; k++)
                {
                    if (processesAfterLaunchingChrome[i].Id == processesBeforeNewChrome[k].Id)
                    {
                        goto skip;
                    }
                }
                l.Add(processesAfterLaunchingChrome[i]);
            skip:;
            }


            foreach (Process p in l)
            {
                ShowWindow(p.MainWindowHandle, SW_RESTORE);
            }


            foreach (Process p in l)
            {
                ShowWindow(p.MainWindowHandle, SW_MINIMIZE);
            }

            foreach (Process p in l)
            {
                ShowWindow(p.MainWindowHandle, SW_RESTORE);
                SetWindowPos(p.MainWindowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
                BringWindowToTop(p.MainWindowHandle);
                SetForegroundWindow(p.MainWindowHandle);
            }

            foreach (Process p in l)
            {
                SetWindowPos(p.MainWindowHandle, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
                SetWindowPos(p.MainWindowHandle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
            }

            foreach (Process p in l)
            {
                ShowWindow(p.MainWindowHandle, SW_RESTORE);
                BringWindowToTop(p.MainWindowHandle);
                SetFocus(new HandleRef(null, p.MainWindowHandle));
            }

            foreach (Process p in l)
            {
                SetForegroundWindow(p.MainWindowHandle);
            }

            gkh.HookedKeys.Add(Keys.Escape);
            gkh.KeyDown += Gkh_KeyDown;

            Application.Run();
        }

        private static void Gkh_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape)
            {
                foreach (Process p in l)
                {
                    try
                    {
                        ShowWindow(p.MainWindowHandle, SW_MINIMIZE);
                    }
                    catch { }
                }
                System.Diagnostics.Process.GetCurrentProcess().Kill();
            }
        }

        static globalKeyboardHook gkh = new globalKeyboardHook();

解决方案

And how does this differ from your previous question: How to get all the handles of a process?[^]

Read the comments, read the answer. Things don't change because you don't like what you are told...


A similar question was asked long ago, maybe you can find something useful in it: Get opened urls from chrome to C# forms application[^]


这篇关于如何只获取新打开的镀铬窗口而不是整个镀铬窗口的所有进程的所有句柄?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆