请问各位大侠,c#中如果通过桌面快捷方式显示隐藏窗体

ch67259 2009-03-17 11:01:07
我的设计为,点击窗体的关闭按钮,使其隐藏至任务栏的托盘中。这是一个单实例的程序,运行时,需要在程序的入口处判断是否已经有该进程在运行,如果没有则正常运行;已有程序则根据该进程的句柄。可是如果已运行该程序,且程序隐藏在托盘中(通过form.hide()方法),则无法通过快捷方式将其显示。我发现迅雷和msn都可以实现类似功能,希望各位能给予解答。

我尝试使用API使窗体显示,可是只能在最小化时显示,隐藏后则无法显示。以下是程序入口处发现已有进程运行时的显示窗体代码
其中instance.MainWindowHandle表示进程的主窗口句柄。
public static void HandleRunningInstance(Process instance)
{
SetForegroundWindow(instance.MainWindowHandle);
ShowWindowAsync(instance.MainWindowHandle, 9);
SendMessage(instance.MainWindowHandle, 0x18, GetFocus(),IntPtr.Zero);
}

[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("User32.dll")]
private static extern IntPtr SendMessage(IntPtr hwnd, uint msg, IntPtr wParam, IntPtr lParam);
[DllImport("User32.dll")]
private static extern IntPtr GetFocus();
...全文
78 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
pennymay 2009-05-29
  • 打赏
  • 举报
回复

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Diagnostics;
using System.Reflection;


namespace Wenita
{
static class Program
{

[STAThread]
public static void Main()
{
//get process is running
Process instance = RunningInstance();
if (instance == null)
{
//if not exist, create a new process
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FrmMainpage());
}
else
{
//handle found process
HandleRunningInstance(instance);
}
}
public static Process RunningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName);

//foreach all process
foreach (Process process in processes)
{
//忽略现有的例程
if (process.Id != current.Id)
{
//确保例程从EXE文件运行
if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") ==current.MainModule.FileName)
{
//返回另一个例程实例
return process;
}
}
}

//not any process, return null
return null;
}

public static void HandleRunningInstance(Process instance)
{
//确保窗口没有被最小化或最大化
ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL);
//设置真实例程为foreground window
SetForegroundWindow(instance.MainWindowHandle);

}

[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
[DllImport("User32.dll")]
private static extern bool
SetForegroundWindow(IntPtr hWnd);
private const int WS_SHOWNORMAL = 1;
}
}



现在如何在窗体被隐藏的时候, 再把他们SHOW出来???
pennymay 2009-05-29
  • 打赏
  • 举报
回复
帮顶, 我现在也想知道这个答案~!~

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧