- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我写了一个类来检测当前的 Excel 主题是什么。
获取 Excel 当前办公主题:
//Declaration
string officeVersion;
int themeCode;
// Get Office Version first
officeVersion = "16.0";
// Goto the Registry Current Version
RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Office\" + officeVersion + @"\Common");
// Get Stored Theme
themeCode = (int)rk.GetValue("UI Theme", GlobalVar.COLORFUL);
themeCode
的值,我可以确定当前的 Excel 主题是什么:
// Theme Constants
public const int COLORFUL = 0;
public const int DARKGREY = 3;
public const int BLACK = 4;
public const int WHITE = 5;
- How can I detect when the user, during Excel Running, change the Office Theme from the Excel Options?
- In Another way, is there any Excel Event triggered when the User has edited anything from the Excel Options?
- How can I detect/trap that event please?
I used already Process Monitor and got the location of the Registry key where the theme is stored. But I cannot constantly check the Registry, I prefer to detect when the user clicked on More Commmand\Excel Options if that event is detectable.
最佳答案
非常感谢@PortlandRunner 在评论中给我的方法。我想出了以下代码:
using Microsoft.Win32;
using System;
using System.Drawing;
using System.Management;
using System.Security.Principal;
namespace YourProject
{
/*
#####################################
# GLOBAL CONSTANTS FOR OFFICE THEME #
# By Tsiriniaina Rakotonirina #
#####################################
*/
public class GlobalVar
{
//Theme Constants
public const int COLORFUL = 0;
public const int DARKGREY = 3;
public const int BLACK = 4;
public const int WHITE = 5;
}
/*
########################################
# OFFICE CLASS TO RETURN TO THE ADDINS #
# By Tsiriniaina Rakotonirina #
########################################
*/
public class ExcelTheme
{
private int code; //Theme Code
private Color backgroundColor;//Addins Backcolor based on Theme
private Color textForeColor; //Addins Text Color based on Theme
public Color BackgroundColor { get => backgroundColor; set => backgroundColor = value; }
public Color TextForeColor { get => textForeColor; set => textForeColor = value; }
public int Code { get => code; set => code = value; }
}
/*
###############################
# OFFICE THEME CHANGE WATCHER #
# By Tsiriniaina Rakotonirina #
###############################
*/
class ExcelThemeWatcher
{
/*
*****************************************
* CLASS CONSTRUCTOR *
* ---> The Watch start right away after *
* the class is created *
*****************************************
*/
public ExcelThemeWatcher()
{
//Start Watching Office Theme Change
//By calling the following method
StartThemeWatcher();
}
/*
*****************************************
* GET OFFICE VERSION *
* ---> Read the Registry and *
* get the Current Office Version *
*****************************************
*/
public int GetOfficeVersion()
{
//Get Current Excel Version
try
{
//Get Office Version
//Goto the Registry Current Version
RegistryKey rk = Registry.ClassesRoot.OpenSubKey(@"Excel.Application\\CurVer");
//Read Current Version
string officeVersion = rk.GetValue("").ToString();
//Office Version
string officeNumberVersion = officeVersion.Split('.')[officeVersion.Split('.').GetUpperBound(0)];
//Return Office Version
return Int32.Parse(officeNumberVersion);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return 0;
}
}
/*
*****************************************
* GET OFFICE THEME *
* ---> Read the Registry and *
* get the Current Office Theme *
*****************************************
*/
private int GetRegistryOfficeTheme()
{
//Get Office Version first
string officeVersion = GetOfficeVersion().ToString("F1");
//Goto the Registry Current Version
RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Office\" + officeVersion + @"\Common");
return Convert.ToInt32(rk.GetValue("UI Theme", GlobalVar.COLORFUL));
}
/*
*****************************************
* GET ADDINS THEME *
* ---> Based on the Office Theme *
* Return the Addins Theme *
*****************************************
*/
public ExcelTheme GetAddinsTheme()
{
ExcelTheme theme = new ExcelTheme();
//Default Theme Code
theme.Code = GetRegistryOfficeTheme();
//Get Background Colors
theme.BackgroundColor = ColorTranslator.FromHtml("#EFE9D7");
theme.TextForeColor = ColorTranslator.FromHtml("#004B8D");
try
{
switch (theme.Code)
{
case GlobalVar.COLORFUL:
theme.BackgroundColor = ColorTranslator.FromHtml("#E6E6E6");
theme.TextForeColor = ColorTranslator.FromHtml("#004B8D");
break;
case GlobalVar.DARKGREY:
theme.BackgroundColor = ColorTranslator.FromHtml("#666666");
theme.TextForeColor = ColorTranslator.FromHtml("White");
break;
case GlobalVar.BLACK:
theme.BackgroundColor = ColorTranslator.FromHtml("#323130");
theme.TextForeColor = ColorTranslator.FromHtml("#CCA03B");
break;
case GlobalVar.WHITE:
theme.BackgroundColor = ColorTranslator.FromHtml("#FFFFFF");
theme.TextForeColor = ColorTranslator.FromHtml("#004B8D");
break;
default:
break;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return theme;
}
/*
******************************************
* START OFFICE THEME CHANGE WATCH *
* ---> Using WMI, read and watch *
* Registry Section for Office Theme *
******************************************
*/
private void StartThemeWatcher()
{
string keyPath; //Office Theme Path
string valueName; //Office Theme Value name
//Get Office Version first
string officeVersion = GetOfficeVersion().ToString("F1");
//Set the KeyPath based on the Office Version
keyPath = @"Software\\Microsoft\\Office\\" + officeVersion + "\\Common";
valueName = "UI Theme";
//Get the Current User ID
//---> HKEY_CURRENT_USER doesn't contain Value as it is a shortcut of HKEY_USERS + User ID
// That is why we get that currentUser ID and use it to read the wanted location
//Get the User ID
var currentUser = WindowsIdentity.GetCurrent();
//Build the Query based on 3 parameters
//Param #1: User ID
//Param #2: Location or Path of the Registry Key
//Param #3: Registry Value to watch
var query = new WqlEventQuery(string.Format(
"SELECT * FROM RegistryValueChangeEvent WHERE Hive='HKEY_USERS' AND KeyPath='{0}\\\\{1}' AND ValueName='{2}'",
currentUser.User.Value, keyPath.Replace("\\", "\\\\"), valueName));
//Create a Watcher based on the "query" we just built
ManagementEventWatcher watcher = new ManagementEventWatcher(query);
//Create the Event using the "Function" to fire up, here called "KeyValueChanged"
watcher.EventArrived += (sender, args) => KeyValueChanged();
//Start the Watcher
watcher.Start();
}
/*
******************************************
* EVENT FIRED UP WHEN CHANGE OCCURS *
* ---> Here the event is instructed *
* to update the Addins Theme *
******************************************
*/
private void KeyValueChanged()
{
// Here, whenever the user change the Office theme,
// this function will automatically Update the Addins Theme
Globals.ThisAddIn.SetAddinsInterfaceTheme();
}
}
}
关于C# Visual Studio Excel 加载项 : How can I detect Excel Office Theme Change?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61186868/
我对 Office Scripts 和 Office Lab 感到困惑。 两者都可以在 Excel 中运行 javascript,但似乎无法在它们中共享代码。 对于 Office 脚本,一些代码如 f
如果我们加载一个引用 office.js 的网页在 Office 客户端之外,我们会收到警告:Office.js is loaded outside of Office client . 这些信息很有
我试图找到一种将 Outlook 插件发布到办公商店的方法。但我发现我们只能发布 Office 应用程序,而不能发布 Office 商店的加载项。因此我想知道 Office 应用程序和 Office
我想使用 Ooxml 以编程方式自定义“Heading1”和“Heading2”样式通过 office.js Visual Studio 代码中的库。我已经搜索过谷歌和许多文档,但仍然没有得到任何内容
我想使用 Microsoft.Office.Interop.Excel 从 XLS 文件中提取一些数据。我安装了 Visual Studio 2010 和 Office 开发人员工具。但是,我在 va
最近,Microsoft 推出了 Office 插件架构,该架构允许开发远程托管并在 Office 内的 IFrame 中运行的插件。我读了很多文章,试图了解这个架构是否是 VSTO 的替代品,或者它
我开发了一个将数据导入 Microsoft Excel 的应用程序。 我使用 VS2005 + .NET 2.0,并且我的计算机上安装了 Microsoft Office 2007 (Office 1
是否有推荐的方法(包、框架等)来设置 Office 加载项的自动化端到端测试。我对测试的所有搜索都导致侧加载应用程序和手动测试。 例如:https://dev.office.com/docs/add-
我们正在为 Excel 和 Word 开发 javascript Office 插件。我们的用户将使用 Office Desktop 和 Office Online。 当用户在加载项中创建新记录时,我
我在电子表格上有一个表格,我想删除所有现有数据。我使用下面的代码,除非表格已经是空的。 // Get the row count let rowCount = table.getRangeBetwee
所以我正在尝试开始开发 Office 365 加载项(以前的 Office 应用程序),我想知道 Office 在呈现您的应用程序时使用什么浏览器或浏览器引擎。我尝试使用 JavaScript 的 n
我正在寻找一些关于在 网上商店 上托管我们当前托管应用程序的更新版本的信息。 我的查询是,我们现有版本的应用程序说的 list 文件 版本。 1.0 托管在网上商店指向源位置(天蓝色 网站)说 mya
在我们的组织中,我们构建了一个 Office 加载项。现在我们想在我们的加载项中添加打印功能。谁能帮助我如何使用 Office javascript API 添加打印功能。 最佳答案 Office.J
我有兴趣了解有关 Microsoft Office Communicator 的更多信息IM 客户端,以及它如何确定您的存在(即您是在计算机旁还是不在)。任何人都可以向我指出解释这一点的教程或 API
问题: 我有两个电子表格,每个电子表格都有不同的用途,但包含一个特定的数据,这两个电子表格中的数据需要相同。这条数据(其中一列)在电子表格 A 中更新,但也需要在电子表格 B 中更新。 目标: 以某种
可在此处获得office.js的正式版本: https://appsforoffice.microsoft.com/lib/1/hosted/office.js 它在代码中包含以下几行: window
不久前我有了一个发现。只需按照以下步骤操作: 在 Office 2003 中创建一个 .doc/.xls/.ppt 文件。在其中保留一些测试数据并关闭该文件。现在重命名该文件以将其文件扩展名更改为随机
姓名:来自:file:///D:/Samples/TestUpdatedVersion/bin/Debug/TestUpdatedVersion.vsto 无法安装自定义,因为当前已安装另一个版本并且
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我对使用 Office 2007 在 2007 之前的二进制格式(.doc、.xls、.ppt)和新的 Office Open XML 格式(.docx、.xlsx、.pptx)之间进行转换很感兴趣
我是一名优秀的程序员,十分优秀!