草庐IT

c# - 如何向Windows任务栏添加内容

coder 2024-06-06 原文

一段时间以来,我一直在努力弄清楚如何将内容添加到时钟旁边的任务栏。您可以在 NetSpeedMonitor 或 NetWorx 中看到这方面的示例。我是任务栏的菜鸟,但无论我怎么看,我都找不到任何东西。我对 ThumbButtonInfo 或 NotifyIcon 不感兴趣。以下是任务栏中的几个内容示例(以防我说的不对)。我希望能够做类似于第一个的事情:

谢谢, 旋律

最佳答案

codeproject 中有一个示例显示 E xtending Explorer with Band Objects using .NET and Windows Forms

Build a Release version of BandObjectLib and register it in the Global Assembly Cache. The easiest way to do this is to open BandObjectLib.sln in Visual Studio, set the active configuration to Release and select 'Rebuild Solution' from the 'Build' menu. The second project in the solution - RegisterLib - is a C++ utility project that performs the 'gacutil /if BandObjectLib.dll' command that puts assembly into GAC.

As you probably already know, Band Objects are COM components. And for the .NET framework to find an assembly that implements a COM component it must be either be registered in the GAC or located in the directory of the client application. There are two possible client applications for Band Objects - explorer.exe and iexplorer.exe. Explorer is located in the windows directory and IE somewhere inside 'Program Files'. So GAC is actually the only one option in this case. Thus .NET assemblies that implement Band Objects should be registered in GAC and all libraries they depend on - like BandObjectLib.dll - should also be there.

Assemblies in the GAC must have strong names and thus key pairs are required. I have provided the BandObjects.snk file with a key pair but I encourage you to replace it with your own. See the sn.exe tool for more details.

Create a new Windows Control Library project and call it SampleBars. We are going to rely on the base functionality of BandObjectLib so we have to add a reference to BandObjectLib\Relase\bin\BandObjectLib.dll. As we are developing a 'Hello World Bar', rename UserControl1.cs and the UserControl1 class inside it appropriately - into HelloWolrdBar.cs and HelloWorldBar. Also put the following lines at the beginning of HelloWorldBar.cs:

using BandObjectLib;
using System.Runtime.InteropServices;

Make HelloWorldBar class inherit BandObject instead of System.Windows.Forms.UserControl. As I mentioned earlier, Band Objects are COM components so we should use the Guid attribute. Use guidgen.exe to generate your unique GUID or you can use the one I have generated for you:

[Guid("AE07101B-46D4-4a98-AF68-0333EA26E113")]

We also have to sign our assembly with a strong name. You can do this by putting the following line into AssemblyInfo.cs file:

[assembly: AssemblyKeyFile(@"..\..\..\BandObjects.snk")]

Now its time to decide what kind of Band Object we want to develop. Lets make it an Explorer Toolbar as well as a Horizontal Explorer Bar (also known as a Browser Communication Band). All we need to do to implement this decision is to add custom BandObject attribute to our HelloWorldBar class:

[Guid("AE07101B-46D4-4a98-AF68-0333EA26E113")]
[BandObject("Hello World Bar",
BandObjectStyle.Horizontal | BandObjectStyle.ExplorerToolbar,
HelpText = "Shows bar that says hello.")]
public class HelloWorldBar : BandObject
{ ...

That's enough to make our control available through 'View->Explorer Bars' and 'View->Toolbars' explorer menus. It also takes care of menu item text - "Hello World Bar", and hen the menu item is highlighted status bar displays "Shows bar that says hello.". Don't you like declarative programming and custom attributes?

Now it is time to open HelloWorldBar.cs in the Visual Studio Designer and put some controls on it. Although in my version of HelloWorldBar I decided to put a single button with 'Say Hello' caption on it you are free to do something more personalized. I made the size of the button equal to the size of the control's client area and also set its Anchor property to the combination of all possible styles - 'Top, Bottom, Left, Right'. The background color is 'HotTrack' and ForeColor is 'Info'.

The BandObject control has several properties specific to the Band Objects (and so classes derived from it) - Title , MinSize, MaxSize and IntegralSize. I set Title for HelloWorldBar to "Hello Bar" and both MinSize and Size to '150, 24'. Oh, and in button's On Click event handler I put code that displays a message box. This is what my final code looks like (and most of it was generated by VS.Net):

using System;
using System.ComponentModel;
using System.Windows.Forms;

using BandObjectLib;
using System.Runtime.InteropServices;

namespace SampleBars
{
    [Guid("AE07101B-46D4-4a98-AF68-0333EA26E113")]
    [BandObject("Hello World Bar", BandObjectStyle.Horizontal 
         | BandObjectStyle.ExplorerToolbar, HelpText = "Shows bar that says hello.")]
    public class HelloWorldBar : BandObject
    {
        private System.Windows.Forms.Button button1;
        private System.ComponentModel.Container components = null;

        public HelloWorldBar()
        {
            InitializeComponent();
        }

        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if( components != null )
                    components.Dispose();
            }
            base.Dispose( disposing );
        }

        #region Component Designer generated code
        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Anchor = (((System.Windows.Forms.AnchorStyles.Top 
                | System.Windows.Forms.AnchorStyles.Bottom) 
                | System.Windows.Forms.AnchorStyles.Left) 
                | System.Windows.Forms.AnchorStyles.Right);
            this.button1.BackColor = System.Drawing.SystemColors.HotTrack;
            this.button1.ForeColor = System.Drawing.SystemColors.Info;
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(150, 24);
            this.button1.TabIndex = 0;
            this.button1.Text = "Say Hello";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // HelloWorldBar
            // 
            this.Controls.AddRange(new System.Windows.Forms.Control[] { this.button1 });
            this.MinSize = new System.Drawing.Size(150, 24);
            this.Name = "HelloWorldBar";
            this.Size = new System.Drawing.Size(150, 24);
            this.Title = "Hello Bar";
            this.ResumeLayout(false);

        }
        #endregion

        private void button1_Click(object sender, System.EventArgs e)
        {
            MessageBox.Show("Hello, World!");
        }
    }
}

Ok, now we are ready to build SampleBars.dll but its not enough to see it in explorer yet. We have to put our assembly into the GAC as well as register it as a COM server. There are tools - gacutil.exe and regasm.exe that do just this. The C++ utility project named Register in my version of the SampleBars solution liberates me from using these tools manually. It has no files in it, just the following post-build command (debug version):

cd $(ProjectDir)..\bin\Debug
gacutil /if SampleBars.dll
regasm SampleBars.dll

Of cause you have to make sure that Register project is the last one to be built in the solution using Project Dependencies / Build Order.

After building the solution, and executing the gacutil and regasm commands, we are finally ready to start Explorer and see our toolbar and explorer bar. And if you did everything right you should be able to see something like the picture at the top of the article. On this picture you can also see how HelloWorldBar looks in the Windows Taskbar. To achieve this all you need to do is to modify BandObject attribute adding the BandObjectStyle.TaskbarToolBar flag.


您可能还想看看 this answer

According to Microsoft, Deskbands are not recommended for Windows 7, although they still work. Also keep in mind that Microsoft requires that Deskbands support Aero on Windows 7 via IDeskband2 Interface, rather than IDeskband. Also, Micorosft has officially said that IDeskBand2 may be altered or unavailable in subsequent versions of the operating system or product.

Finally, be very careful about creating shell extensions in managed code.

关于c# - 如何向Windows任务栏添加内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35882294/

有关c# - 如何向Windows任务栏添加内容的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  4. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  5. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  6. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  7. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  10. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

随机推荐