加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何使用c#引入窗口前景?

发布时间:2020-12-15 18:30:54 所属栏目:百科 来源:网络整理
导读:我试图带一个窗口前景.我正在使用此代码.但它不起作用.有人可以帮忙吗? ShowWindowAsync(wnd.hWnd,SW_SHOW);SetForegroundWindow(wnd.hWnd);// Code from Karl E. Peterson,www.mvps.org/vb/sample.htm// Converted to Delphi by Ray Lischner// Published
我试图带一个窗口前景.我正在使用此代码.但它不起作用.有人可以帮忙吗?
ShowWindowAsync(wnd.hWnd,SW_SHOW);

SetForegroundWindow(wnd.hWnd);
// Code from Karl E. Peterson,www.mvps.org/vb/sample.htm
// Converted to Delphi by Ray Lischner
// Published in The Delphi Magazine 55,page 16
// Converted to C# by Kevin Gale
IntPtr foregroundWindow = GetForegroundWindow();
IntPtr Dummy = IntPtr.Zero;

uint foregroundThreadId = GetWindowThreadProcessId(foregroundWindow,Dummy);
uint thisThreadId = GetWindowThreadProcessId(wnd.hWnd,Dummy);

 if (AttachThreadInput(thisThreadId,foregroundThreadId,true))
 {
    BringWindowToTop(wnd.hWnd); // IE 5.5 related hack
    SetForegroundWindow(wnd.hWnd);
    AttachThreadInput(thisThreadId,false);
 }

 if (GetForegroundWindow() != wnd.hWnd)
 {
     // Code by Daniel P. Stasinski
     // Converted to C# by Kevin Gale
    IntPtr Timeout = IntPtr.Zero;
    SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT,Timeout,0);
    SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,Dummy,SPIF_SENDCHANGE);
    BringWindowToTop(wnd.hWnd); // IE 5.5 related hack
    SetForegroundWindow(wnd.hWnd);
    SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,SPIF_SENDCHANGE);
 }

代码解释

Making a window the foreground window
requires more than just calling the
SetForegroundWindow API. You must
first determine the foreground thread
and attach it to your window,using
AttachThreadInput,then call
SetForegroundWindow. That way they can
share input states.

First I call GetForegroundWindow to
get the handle of the current
foreground window. Then a few calls to
GetWindowThreadProcessId retrieve the
threads associated with the current
foreground window and the window I
want to bring to the foreground. If
these threads are the same a simple
call to SetForegroundWindow is all
that is necessary. Otherwise,the
foreground thread is attached to the
window that I am bringing to the front
and detached from what was the current
foreground window. The
AttachThreadInput API handles this.

内容摘自here
谢谢.

解决方法

我以前用过这个方法:
[DllImport("user32.dll")]
    static extern bool SetForegroundWindow(IntPtr hWnd);

    Process[] processes = Process.GetProcessesByName("processname");
    SetForegroundWindow(processes[0].MainWindowHandle);

更多信息:http://pinvoke.net/default.aspx/user32.SetForegroundWindow

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读