我正在尝试创建一个WPF窗口WindowStyle="None"(用于自定义按钮,没有标题),无法调整大小.设置ResizeMode以NoResize删除我想要保留的空气边界.
我可以设置最小/最大尺寸属性并完成它,除了:
所以,我有一个简单的方案,让我99%的方式:
public class BorderedWindowNoResize : Window
{
[DllImport( "DwmApi.dll" )]
public static extern int DwmExtendFrameIntoClientArea(
IntPtr hwnd,
ref MARGINS pMarInset );
[DllImport( "user32.dll", CharSet = CharSet.Auto )]
public static extern IntPtr DefWindowProc(
IntPtr hWnd,
int msg,
IntPtr wParam,
IntPtr lParam );
public BorderedWindowNoResize()
{
Loaded += BorderedWindowNoResize_Loaded;
}
private void BorderedWindowNoResize_Loaded( object sender, RoutedEventArgs e )
{
IntPtr mainWindowPtr = new WindowInteropHelper( this ).Handle;
HwndSource mainWindowSrc = HwndSource.FromHwnd( mainWindowPtr ); …Run Code Online (Sandbox Code Playgroud) 对不起,标题很难理解.我不确定如何说出来.
我有一个应用程序,只允许每个用户会话运行一个实例.如果用户再次单击以启动应用程序,我希望将该应用程序重点关注.
该窗口可能具有折叠的可见性.
如果它可见,我知道我可以使用
if (IsIconic(hWnd))
{
ShowWindowAsync(hWnd, swRestore);
}
SetForegroundWindow(hWnd);
Run Code Online (Sandbox Code Playgroud)
但是如果窗户折叠了,有没有办法让我把它带回可见的?
我正在构建一个WinForms应用程序,通过每隔500毫秒获取一次屏幕截图来记录外部进程的步骤.我使用以下代码:
Bitmap bmp = new Bitmap(width, height,PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bmp);
g.CopyFromScreen(rect.left,
rect.top,
0,
0,
new Size(width, height),
CopyPixelOperation.SourceCopy);
Run Code Online (Sandbox Code Playgroud)
代码工作正常但唯一的问题是当我从外部进程的窗口打开一个对话框时(例如,Save As...在记事本中打开对话框),屏幕截图冻结到原始窗口而不是显示对话框.
我的理论是,由于我使用以下代码来检测应用程序是否失去焦点,然后只需恢复到上次保存的屏幕截图:
if (GetForegroundWindow() != proc.MainWindowHandle) //proc is just a process from system process list by Process.GetProcessesByName()
{
return LastScreenShot;
}
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern IntPtr GetForegroundWindow();
Run Code Online (Sandbox Code Playgroud)
但是,此代码对于向用户仅显示正在记录的应用程序而不是在记录区域内或记录区域内的桌面部分中拖动的任何其他应用程序是必要的.此外,当我单击菜单时,它有时会显示菜单在褪色位置冻结,有时根本不显示或显示但在屏幕截图中看不到导航突出显示.
那么有什么办法可以解决这个问题吗?
类似的问题在这里被问到 屏幕捕获没有捕获我的应用程序中的对话框, 但它没有解决我的问题,因为答案使用相同的代码,我的应用程序没有采取整个桌面的截图.
我有一个基于服务器的控制台应用程序.我只希望为特定服务器一次运行一个实例(这与可能正在运行它的用户无关).
我需要添加一个检查以确保它的1个实例正在运行,我已经可以通过检查服务器上的运行进程来做到这一点,但这是最佳做法吗?
由于我一直在寻找改进编码风格和保持最新的方法,最近有更好的方法吗?如果您正在考虑 - "如果没有破坏就不要修复它",也许您是对的,但我想更多地利用内置功能的框架.
我使用的是.net v3.5,这是一个控制台应用程序.
提前致谢
可能重复:
创建单实例应用程序的正确方法是什么?
如何检查我的应用程序是否已打开?如果我的应用程序已经运行,我想显示它而不是打开一个新实例.
我想在我的.Net应用程序的同一个实例中打开在资源管理器中双击的文件,例如在新选项卡中.我怎样才能做到这一点?
现在,每个文件都会启动我的应用程序的新实例.许多程序可以在同一个实例中打开文件,例如Opera和Notepad ++,因此有一种简单的方法可以肯定.
我正在处理一个应用程序,在任何给定时间只能存在一个实例.有几种可能性来实现这一目标:
互斥选项在我看来是最可靠和优雅的.
但是,在我的第二个实例终止之前,我想向已经运行的实例发布一条消息.为此,我需要一个拥有互斥锁的线程(或进程)的句柄.
但是,似乎没有API函数来获取给定互斥锁的创建者/所有者.我只是俯视它吗?有没有其他方法来到这个线程/进程?还有另一种方法可以解决这个问题吗?
更新:这个人只是向所有正在运行的进程广播一条消息.我想这是可能的,但我真的不喜欢它......
最近,我决定将我的一个用 C# 编写并针对.NET Framework 4.5 的 WPF Windows 桌面应用程序迁移到最新的.NET Core 3.1。一切都很好,直到我必须添加对单实例应用程序的支持,同时能够将任何参数从第二个实例传递到第一个运行实例。我之前针对单实例应用程序的 WPF 实现是使用System.Runtime.Remoting,这在 .NET Core 中不可用。因此我必须做一些新的事情。下面是我想出的实现。它工作得很好,但我觉得它可以改进。请随意讨论和改进建议的解决方案。
我创建了一个 SingleInstanceService,它使用信号量来指示它是否是第一个实例。如果它是第一个实例,我将创建一个 TcpListener 并无限期地等待从第二个实例传递的任何参数。如果启动了第二个实例,则我将第二个实例的参数发送到第一个侦听实例,然后退出第二个实例。
internal class SingleInstanceService
{
internal Action<string[]> OnArgumentsReceived;
internal bool IsFirstInstance()
{
if (Semaphore.TryOpenExisting(semaphoreName, out semaphore))
{
Task.Run(() => { SendArguments(); Environment.Exit(0); });
return false;
}
else
{
semaphore = new Semaphore(0, 1, semaphoreName);
Task.Run(() => ListenForArguments());
return true;
}
}
private void ListenForArguments()
{
TcpListener tcpListener = new TcpListener(IPAddress.Parse(localHost), localPort);
try
{
tcpListener.Start();
while …Run Code Online (Sandbox Code Playgroud) 我有一个 WPF 应用程序。当它启动时,我需要检查是否已经有一个实例在运行。如果是这种情况,那么我会使用 PInvoke 来“显示”正在运行的实例:
SendNotifyMessage(proc.MainWindowHandle, ShowYourself, IntPtr.Zero, IntPtr.Zero);
Run Code Online (Sandbox Code Playgroud)
其中 proc 是另一个正在运行的实例
问题是,当proc隐藏在系统托盘中时。MainWindowHandle是 0。我做了很多搜索,但没有运气得到MainWindowHandle.
有人知道怎么做吗?
谢谢
我有一个简单的c#控制台应用程序,每隔5分钟安排一次.每次调用程序都需要上次运行的输出.
我现在正在做的是使用文本文件并将结果存储在其中.下次运行时,它会打开文本文件并知道上一次运行的输出.
有没有其他方法可以做到不需要任何这样的文本文件?喜欢维护会话变量等?