使用C#,我想将一个特定窗口带到屏幕顶部,之后我会在其上运行一个宏。
试过了,
[DllImportAttribute("User32.dll")]
private static extern int FindWindow(String ClassName, String WindowName);
[DllImportAttribute("User32.dll")]
private static extern int SetForegroundWindow(int hWnd);
之后,
string main_title;
Process[] processlist = Process.GetProcesses();
foreach (Process theprocess in processlist)
{
if (theprocess.ProcessName.StartsWith(name))
{
main_title = theprocess.MainWindowTitle;
hWnd = theprocess.Handle.ToInt32();
break;
}
hWnd = FindWindow(null, main_title);
if (hWnd > 0)
{
SetForegroundWindow(hWnd);
}
并得到了错误,
无法找到类型或命名空间名称'DllImportAttribute'
所使用的,
using System.Runtime;
现在我无法在我的代码中识别hWnd,尽管它们都位于相同的命名空间和部分类中。
经过试验,
IntPtr hWnd;
Process[] processlist = Process.GetProcesses();
foreach (Process theprocess in processlist)
{
if (theprocess.ProcessName.StartsWith("msnmsgr"))
{
main_title = theprocess.MainWindowTitle;
hWnd = theprocess.MainWindowHandle;
SetForegroundWindow(hWnd);
}
}
这看起来像是窗口的前景,至少根据alt-tab顺序和应用程序看起来像从工具栏中选择,但它不会变得可见。
答案 0 :(得分:1)
尝试使用DllImport,如下所示:
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.DLL")]
public static extern IntPtr FindWindow(string lpszClass, string lpszWindow);
定义hWnd,如:
IntPtr hWnd;
在你的任务中做:
hWnd = theProcess.MainWindowHandle; // or use your theProcess.Handle
此外,if语句中的中断如果找到则不会将窗口设置为前景。您需要将该代码段重新编写为:
if (theprocess.ProcessName.StartsWith(name))
{
main_title = theprocess.MainWindowTitle;
hWnd = theProcess.MainWindowHandle;
}
else
hWnd = FindWindow(null, main_title);
if (hWnd != null && !hWnd.Equals(IntPtr.Zero))
{
SetForegroundWindow(hWnd);
// may want to put your break here
}
窗口类
Win32只是一个包含上述所有DllImport的类,因为我在多个Win32子类中使用它们。
public class Window : Win32
{
public IntPtr Handle;
public Window(IntPtr handle)
{
Handle = handle;
}
public bool Visible
{
get { return IsWindowVisible(Handle); }
set
{
ShowWindow(Handle, value ? ShowWindowConsts.SW_SHOW :
ShowWindowConsts.SW_HIDE);
}
}
public void Show()
{
Visible = true;
SetForegroundWindow(Handle);
/*
try { SwitchToThisWindow(Handle, false); } // this is deprecated - may throw on new window platform someday
catch { SetForegroundWindow(Handle); } //
*/
}
public void Hide() { Visible = false; }
}
ShowWindowConsts类
namespace Win32
{
public class ShowWindowConsts
{
// Reference: http://msdn.microsoft.com/en-us/library/ms633548(VS.85).aspx
/// <summary>
/// Minimizes a window, even if the thread that owns the window is not responding.
/// This flag should only be used when minimizing windows from a different thread.
/// </summary>
public const int SW_FORCEMINIMIZE = 11;
/// <summary>
/// Hides the window and activates another window.
/// </summary>
public const int SW_HIDE = 0;
/// <summary>
/// Maximizes the specified window.
/// </summary>
public const int SW_MAXIMIZE = 3;
/// <summary>
/// Minimizes the specified window and activates the next top-level window in the Z order.
/// </summary>
public const int SW_MINIMIZE = 6;
/// <summary>
/// Activates and displays the window.
/// If the window is minimized or maximized, the system restores it to
/// its original size and position.
/// An application should specify this flag when restoring a minimized window.
/// </summary>
public const int SW_RESTORE = 9;
/// <summary>
/// Activates the window and displays it in its current size and position.
/// </summary>
public const int SW_SHOW = 5;
/// <summary>
/// Sets the show state based on the public const long SW_ value specified in
/// the STARTUPINFO structure passed to the CreateProcess function by
/// the program that started the application.
/// </summary>
public const int SW_SHOWDEFAULT = 10;
/// <summary>
/// Activates the window and displays it as a maximized window.
/// </summary>
public const int SW_SHOWMAXIMIZED = 3;
/// <summary>
/// Activates the window and displays it as a minimized window.
/// </summary>
public const int SW_SHOWMINIMIZED = 2;
/// <summary>
/// Displays the window as a minimized window.
/// This value is similar to public const long SW_SHOWMINIMIZED,
/// except the window is not activated.
/// </summary>
public const int SW_SHOWMINNOACTIVE = 7;
/// <summary>
/// Displays the window in its current size and position.
/// This value is similar to public const long SW_SHOW, except that the window is not activated.
/// </summary>
public const int SW_SHOWNA = 8;
/// <summary>
/// Displays a window in its most recent size and position.
/// This value is similar to public const long SW_SHOWNORMAL,
/// except that the window is not activated.
/// </summary>
public const int SW_SHOWNOACTIVATE = 4;
public const int SW_SHOWNORMAL = 1;
}
}
所以你的代码会变成:
if (theprocess.ProcessName.StartsWith(name))
{
main_title = theprocess.MainWindowTitle;
hWnd = theProcess.MainWindowHandle;
}
else
hWnd = FindWindow(null, main_title);
if (hWnd != null && !hWnd.Equals(IntPtr.Zero))
{
new Window(hWnd).Show();
}