Win32API使用技巧 -- 置顶应用
2020/12/22 16:07:36
本文主要是介绍Win32API使用技巧 -- 置顶应用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Win32提供了SetForegroundWindow方法可以将应用设置到前台并激活,但是在某些场景下,只调用该接口会返回0,即设置失败。比如如下场景:
当前前台应用为一个全屏的应用,非前台应用的进程使用Process.Start()
方法启动截图工具,尝试使用SetForegroundWindow()
将窗口设置到前台,此时会概率性设置失败。
尝试了多种方法后,最终使用如下方法解决了该问题:
public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1); public static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2); public const int SWP_NOSIZE = 0x1; public const int SWP_NOMOVE = 0x2; [DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hwnd); [DllImport("user32.dll")] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll")] public static extern bool SetWindowPos(IntPtr hwnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags); public void StartSnippingTool() { if (!Envronment.Is64BitProcess) { Process.Start(@"C:\Windows\sysnative\SnippingTool.exe"); } else { Process.Start(@"C:\Windows\system32\SnippingTool.exe"); } Thread.Sleep(500); IntPtr snippingToolHandle = FindWindow("Microsoft-Windows-SnipperToolbar", "截图工具"); if (snippingToolHandle != IntPtr.Zero) { SetForegroundWindowCustom(snippingToolHandle); } } private void SetForegroundWindowCustom(IntPtr hwnd) { IntPtr currentWindow = GetForegroundWindow(); if (currentWindow == hwnd) { Console.WriteLine("应用已在顶层"); return; } SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE); SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE); bool result = SetForegroundWindow(hwnd); if (result) { Console.WriteLine("置顶应用成功"); } else { Console.WriteLine("置顶应用失败"); } }
这篇关于Win32API使用技巧 -- 置顶应用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具