C# Win10 多屏自启浏览器

C#窗体实现的仿WIN10标准计算器 上周C#的第一节winform课结束后老师布置了一个计算器的作业。由于之前学过C++所以语法方面都没什么问题,只是以前的代码练习都不怎么多,所以也想趁着这次学习语言的机会多练习。这是我的第一篇博客,若有什么不当之处,请多指教。我做的这个计算器是模仿的win10,大部分功能都实现了。比如连续按操作符(单目、双目)可以一直计算下去,不是只能简单的1+1之后必须按=出结果。进行完一次运算后(双目的按=算... 阅读详情

项目场景:

公司展厅使用时,需要在多个屏幕开启一些指定的网页,免去每次人工操作。

  • 控制台应用
  • .NET Framework 4.8
  • 引用 System.Drawing

开机自启的话, 键盘按下win+R,输入命令"shell:startup",把exe扔进去。


思路:

  • 从注册表中获取默认浏览器可执行文件路径。
  • 获取系统上所有显示器的数组。
  • 开启浏览器到各个显示器并全屏显示。(理论上,浏览器应该能全屏打开网页才对。没试出来,所以采用F11方法干。)

实现

user32.dll

/// <summary>
/// 检索前台窗口的句柄, (用户当前正在使用的窗口) 。 系统向创建前台窗口的线程分配略高于其他线程的优先级。
/// </summary>
/// <returns></returns>
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
/// <summary>
/// 更改子窗口、弹出窗口或顶级窗口的大小、位置和 Z 顺序。 这些窗口根据屏幕上的外观进行排序。 最上面的窗口接收最高排名,是 Z 顺序中的第一个窗口。
/// </summary>
/// <param name="hWnd">窗口的句柄。</param>
/// <param name="hWndInsertAfter">1:将窗口置于 Z 顺序的底部。-2:将窗口置于所有非顶部窗口上方 (,即位于最顶部窗口) 后面。0:将窗口置于 Z 顺序的顶部。-1:将窗口置于所有非最顶部窗口的上面。</param>
/// <param name="X">窗口左侧的新位置,以客户端坐标表示。</param>
/// <param name="Y">窗口顶部的新位置,以客户端坐标表示。</param>
/// <param name="cx">窗口的新宽度(以像素为单位)。</param>
/// <param name="cy">窗口的新高度(以像素为单位)。</param>
/// <param name="uFlags"></param>
/// <returns></returns>
[DllImport("user32.dll")]
static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
/// <summary>
/// 阻止键盘和鼠标输入事件到达应用程序。
/// </summary>
/// <param name="Block">函数的用途。 如果此参数为 TRUE,则阻止键盘和鼠标输入事件。 如果此参数为 FALSE,则取消阻止键盘和鼠标事件。 请注意,只有阻止输入的线程才能成功取消阻止输入。</param>
[DllImport("user32.dll")]
static extern void BlockInput(bool Block);

Main

private static Dictionary<string, string> dic = new Dictionary<string, string>
{
    {@"\\.\DISPLAY1","https://www.baidu.com/"},
    {@"\\.\DISPLAY2","https://cn.bing.com/"},
    {@"\\.\DISPLAY5","http://www.google.cn/"},//分屏器会跳过某些屏
};
static void Main(string[] args)
{
    try
    {
        //锁定鼠标及键盘
        BlockInput(true);

        //
        var browserPath = GetDefaultWebBrowserFilePath();

        //
        Screen[] screens = Screen.AllScreens;
        /*
            \\.\DISPLAY1
            \\.\DISPLAY2
         */
        for (int i = 0; i < screens.Length; i++)
        {
            if (dic.TryGetValue(screens[i].DeviceName, out string url))
            {
                OpenBrowser(screens[i], browserPath, url);
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    finally
    {
        //解除键盘鼠标锁定
        BlockInput(false);
        //Console.ReadLine();
    }
}

一些方法

/// <summary>
/// 从注册表中获取默认浏览器可执行文件路径
/// </summary>
/// <returns></returns>
public static string GetDefaultWebBrowserFilePath()
{
    //计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice
    RegistryKey CURRENT_USER = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice\");
    string ProgId = CURRENT_USER.GetValue("ProgId").ToString();

    //计算机\HKEY_CLASSES_ROOT\MSEdgeHTM\shell\open\command
    RegistryKey CLASSES_ROOT = Registry.ClassesRoot.OpenSubKey($@"{ProgId}\shell\open\command\");
    string browser = CLASSES_ROOT.GetValue("").ToString();

    //browser就是你的默认浏览器,不过后面带了参数,把它截去,不过需要注意的是:不同的浏览器后面的参数不一样!
    //"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --single-argument %1
    browser = browser.Substring(1, browser.IndexOf('\"', 1) - 1);

    //C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
    return browser;
}

/// <summary>
/// 
/// </summary>
/// <param name="screen"></param>
/// <param name="browserPath"></param>
/// <param name="url"></param>
public static async void OpenBrowser(Screen screen, string browserPath, string url)
{
    //
    Process proc = Process.Start(browserPath, $"{url} --new-window");

    //确保启动成功
    proc.WaitForExit();
    do
    {
        Thread.Sleep(500);
    } while (!proc.HasExited);

    //
    var wnd = GetForegroundWindow();
    SetWindowPos(wnd, 0, screen.Bounds.X, screen.Bounds.Y, 0, 0, 0x0001);

    //
    Thread.Sleep(200);

    //
    SendKeys.SendWait("{F11}");
}

Win10 本地IIS搭建,部署C# .net项目 1、IIS搭建 1)控制面板--程序--启用或关闭Windows功能--Internet Information Services,选择需要的功能,这里我安装的是最新版asp .net 4.7,点击确定下载安装,重启电脑后完成更改。 2)浏览器访问http://localhost/,出现下图界面,表示安装成功 2、部署C# .net项目 1)VS中打开项目,选择要发布的项目... 阅读详情

相关推荐

Win10 IoT C#开发 3 - UART 串口通信

Win10 IoT 平台使用C#进行UART串口通信开发,读取传感器数据,并把接收到的数据推送到服务器。

CloudTech 6549

C# 操作Chrome浏览器全屏模式打开页面

c# 实现,自动调用谷歌浏览器打开h5页面

qq_28331393的博客 1398

Win10 IoT C#开发 1 - Raspberry安装IoT系统及搭建开发环境

用图文形式全面介绍以最简单的方法在 Raspberry Pi 2 上安装 Windows 10 IoT Core 操作系统及搭建 VS2015 IoT 开发环境。

CloudTech 1万+

bat命令电脑开机后自动打开Edge浏览器网页并全屏显示

组合技让电脑开机后自动打开edge浏览器并全屏显示(并且不会显示浏览器上方和右侧的边框),可以用于车站,企业,学校等公共场合的大显示屏(亲测好用,无需单独编写程序)。

Tuimaohenyouya的博客 1万+

解决Win10缩放导致c# Winform字体模糊

问题 现在的电脑分辨率很高,Win10很人性化的提供了屏幕缩放功能,一般默认放大比例为150%、200%等,如下图所示,在这种情况下,我们用VS开发的Winform窗体显示就有问题了,文字和图像都变得模糊了 解决 方案一 添加应用程序清单文件 为应用程序添加app.manifest清单文件 取消清单文件中的,如下注释: <!-- 指示该应用程序可以感知 DPI 且 Windows 在 DPI 较高时将不会对其进行 自动缩放。Windows Present..

小宝的专栏 2717

C# VLC监视扩展桌面

从Win7开始,Windows支持多显示器输出,多个显示器可以作为相互“复制”(显示同一桌面),也可以“扩展”(两个显示器拼成大桌面)。这时可以在一个桌面的程序中,用VLC监视另一个桌面。3、配置VLC库文件路径:VLC控件→事件→VlcLibDirectoryNeeded。1、安装扩展:工具→包管理器→浏览“VLC”→安装扩展。2、从工具箱中拖动VLC控件到窗体设计器中。4、监控桌面代码:(扩展桌面在主桌面右侧)

dgnankai的专栏 743

C# 各屏独立信号的多屏推送软件

  早期开发的一个工具。初建大屏展示墙时,利用现有的主机,对大屏系统平台不了解,买了9块专用大显示器和架子,就搭起来了。因为现在买了专业的多屏处理硬件合成了,场景无法还原了。还记得当时加上自带的小显示器,10个显示器。10组线号输入,按装win10系统,不知哪个线路在哪个摆放的位置,主屏位置也经常无法捕捉。鼠标也是经常出现移不回主屏的情况。   后来开发了多屏控制的工具,工具可以自动打开9个程序,推送到对应位置。按快捷键鼠标回主屏,自定义推送程序到对应屏(同时鼠标也到对应屏)。 .

chenxiaotao22的专栏 770

C#扩展桌面的处理

解决扩展桌面代码问题

dgnankai的专栏 1308

c++ 调用c# dll修改win10锁屏背景

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using Windows.Storage; using Windows.System.UserProfile; using Windows.Foundation.Metadata; namespace LockscreenWin10 {

1535

解决Windows 10中Win+G无法录屏的问题

运行生成的可执行文件后,它将模拟按下Win+G组合键,从而调用Windows 10的录屏功能。Windows 10提供了一种方便的方法来录制屏幕,即通过按下Win+G组合键来调用内置的游戏栏功能。然而,有时候用户可能会遇到按下Win+G无法启动录屏功能的情况。希望以上解决方案能够帮助您解决Windows 10中Win+G无法录屏的问题。如果以上解决方案仍未解决问题,您可以尝试使用编程方式调用Windows 10的录屏功能。某些应用程序可能会使用Win+G组合键进行其他功能,从而导致与游戏栏的冲突。

HackSquad的博客 8971

Win10 Xbox录屏文件存储位置及编程相关

本文将介绍Win10 Xbox录屏文件的默认存储位置,并提供一些编程示例来操作这些文件。通过上述示例代码,您可以在编程中获取和处理Win10 Xbox录屏文件。在这个文件夹下,您可以找到所有通过Win10 Xbox录屏功能录制的视频文件。您可以使用编程语言来获取和处理这些文件,如Python和C#示例代码所示。希望本文对您有所帮助!Win10 Xbox录屏功能的录屏文件默认存储在用户的视频文件夹中。最后,通过循环打印出所有录屏文件的文件名。Win10 Xbox录屏文件默认存储在用户的视频文件夹中,路径为。

CoderExtra的博客 1106

C# 在win10/win11调用默认浏览器打开网页

C# win10 win11 默认浏览器 打开网页

InfSein的博客 2750

解决Win10系统中Edge浏览器的卡顿问题

然而,有时候用户可能会遇到Edge浏览器使用不流畅的问题,这可能会影响他们的浏览体验。在本文中,我将为您提供一些解决Win10系统中Edge浏览器卡顿问题的方法,并附带相应的源代码。您可以尝试禁用不必要的浏览器扩展来改善Edge浏览器的性能。以上是一些常见的解决Win10系统中Edge浏览器卡顿问题的方法。希望这些方法能够帮助您解决Edge浏览器的卡顿问题。有时候,卡顿问题可能是由于旧版本的Edge浏览器引起的。在运行任何代码之前,请确保您理解代码的作用,并根据自己的需求进行适当的修改和调整。

2301_79326510的博客 1800

Win10 平台C#与低功耗蓝牙BLE设备通信案例

前几天接了个单,客户要在win10电脑上做个工具软件,跟蓝牙锁设备相互通信。一开始以为是普通的蓝牙设备呢,收到客户寄来的测试设备,才发现是低功耗BLE蓝牙设备。 PS:当时我研发用的台式机是没有蓝牙设备的,客户给寄了个USB的蓝牙适配器,插上后,系统自动安装了驱动,但是在设备发现页面,一直无法发现附近的设备。后来联系到厂家,装了他们的专用驱动就可以了,有遇到类似情况的小伙伴,及得找蓝牙设备厂家要驱动试下。 下面进入正题,PC上与BLE通信的案例真不多,一开始打算用JavaFX做的呢,后来发现Java在P

shengfakun1234的专栏 1万+

Win10电脑录屏编程指南

屏幕录制实质上是对屏幕上的图像进行实时捕捉,并将其保存为视频文件。请注意,这只是一个简单的示例,实际的屏幕录制程序可能需要更多的功能和优化。但是,通过理解这个示例,你可以开始编写自己的屏幕录制程序,并根据需要进行扩展和改进。请注意,这只是一个简单的示例,实际的屏幕录制程序可能需要更多的功能和优化。在Win10电脑上实现屏幕录制是一项常见的任务,它在许多领域,如教育、演示、游戏开发等方面都有广泛的应用。在Win10电脑上实现屏幕录制是一项常见的任务,它在许多领域,如教育、演示、游戏开发等方面都有广泛的应用。

Book_Sea的博客 302

C#自动化工具:Win10锁屏壁纸保存程序

在本章中,我们将深入探讨C#小程序开发的基础知识,为后续章节中关于Windows API调用、文件操作、图片处理以及用户界面设计等高级话题打下坚实的基础。C#作为一门功能强大的编程语言,它支持面向对象编程,使得开发者能够以模块化和结构化的方式来构建软件。这一章将简要介绍C#的小程序开发概述,包括开发环境的搭建、开发工具的选择,以及如何使用C#编写小型应用程序的初识。此外,本章还会对C#在小程序开发中的应用做快速概览,便于读者对之后章节中更加专业的技术点有一个前期的理解和期待。

weixin_35749545的博客 768

C#仿win10计算器

win10自带的计算器 win10自带的计算器挺好用的,有很多模式(标准、科学、程序员等等),而且界面很简洁。并且其 C++代码已经开源了https://github.com/Microsoft/calculator 这里上面几个按键可能有人还不熟悉,先简单介绍一下: MS:记忆当前显示的数字(Memory Save) MC:清除记忆的数字(Memory Clean) MR:显示记忆的数字(M...

BuXianShan的博客 3756

C# Winform多屏幕多显示器编程技巧实例

主要介绍了C# Winform多屏幕多显示器编程技巧实例,本文直接给出代码实例,需要的朋友可以参考下

下一篇: C# 使用 NPOI 读取 Excel 转为 Entity
wooderZ
博客等级 码龄9年 32粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值