- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设我有两个名为 launcher.exe
和 launchee.exe
的程序。启动器显示一个按钮,单击该按钮会启动 launchee.exe
,launchee.exe
是一个简单的 hello world 程序。
如果我不采取任何措施来阻止它,当用户将 hello world 程序“固定到任务栏”时,它将固定 launchee.exe
并且不会通过启动器启动应用程序.
告诉 Windows 固定 launcher.exe 而不是 launchee.exe 的最佳方法是什么?
为了使事情更具体,这里有一个用 C# 实现 launcher.exe
的例子:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Diagnostics;
public class Launcher : Form
{
static public void Main ()
{
Application.Run (new Launcher ());
}
public Launcher ()
{
Button b = new Button ();
b.Text = "Launch";
b.Click += new EventHandler (Button_Click);
Controls.Add (b);
}
private void Button_Click (object sender, EventArgs e)
{
Process.Start("launchee.exe");
System.Environment.Exit(0);
}
}
和launchee.exe
:
using System;
using System.Drawing;
using System.Windows.Forms;
public class Launchee : Form
{
static public void Main ()
{
Application.Run (new Launchee ());
}
public Launchee ()
{
Label b = new Label();
b.Text = "Hello World !";
Controls.Add (b);
}
}
最佳答案
我提出了一个基于绑定(bind)低级 API 来访问 AppUserModelID 的答案。 .我发现这个解决方案脆弱而困惑。它的灵感主要来自 Windows Api CodePack微软好像已经停产了。我希望有人会提出一个更清洁的解决方案。
其目的是将 AppUserId 设置为“Stackoverflow.chain.process.pinning”并手动设置 RelaunchCommand 以及 DisplayName 属性(它们必须根据 AppUserModelID 一起设置)。
要在示例实现中使用它,需要调用 TaskBar.SetupLauncher(this)
和 TaskBar.SetupLaunchee(this)
分别在Launcher
和 Launchee
构造函数。
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
internal struct PropertyKey
{
Guid formatId;
int propertyId;
internal PropertyKey(Guid guid, int propertyId)
{
this.formatId = guid;
this.propertyId = propertyId;
}
}
[StructLayout(LayoutKind.Explicit)]
internal struct PropVariant
{
[FieldOffset(0)] internal ushort vt;
[FieldOffset(8)] internal IntPtr pv;
[FieldOffset(8)] internal UInt64 padding;
[DllImport("Ole32.dll", PreserveSig = false)]
internal static extern void PropVariantClear(ref PropVariant pvar);
internal PropVariant(string value)
{
this.vt = (ushort)VarEnum.VT_LPWSTR;
this.padding = 0;
this.pv = Marshal.StringToCoTaskMemUni(value);
}
internal void Clear()
{
PropVariantClear (ref this);
}
}
[ComImport,
Guid("886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IPropertyStore
{
int GetCount([Out] out uint propertyCount);
void GetAt([In] uint propertyIndex, [Out, MarshalAs(UnmanagedType.Struct)] out PropertyKey key);
void GetValue([In, MarshalAs(UnmanagedType.Struct)] ref PropertyKey key, [Out, MarshalAs(UnmanagedType.Struct)] out PropVariant pv);
void SetValue([In, MarshalAs(UnmanagedType.Struct)] ref PropertyKey key, [In, MarshalAs(UnmanagedType.Struct)] ref PropVariant pv);
void Commit();
}
internal static class TaskBar {
[DllImport("shell32.dll")]
static extern int SHGetPropertyStoreForWindow(
IntPtr hwnd,
ref Guid iid /*IID_IPropertyStore*/,
[Out(), MarshalAs(UnmanagedType.Interface)]out IPropertyStore propertyStore);
internal static class Key {
private static Guid propGuid = new Guid("9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3");
internal static PropertyKey AppId = new PropertyKey(propGuid, 5);
internal static PropertyKey RelaunchCommand = new PropertyKey(propGuid, 2);
internal static PropertyKey DisplayName = new PropertyKey(propGuid, 4);
}
private static void ClearValue(IPropertyStore store, PropertyKey key) {
var prop = new PropVariant();
prop.vt = (ushort)VarEnum.VT_EMPTY;
store.SetValue(ref key, ref prop);
}
private static void SetValue(IPropertyStore store, PropertyKey key, string value) {
var prop = new PropVariant(value);
store.SetValue(ref key, ref prop);
prop.Clear();
}
internal static IPropertyStore Store(IntPtr handle) {
IPropertyStore store;
var store_guid = new Guid("886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99");
int rc = SHGetPropertyStoreForWindow(handle, ref store_guid, out store);
if (rc != 0) throw Marshal.GetExceptionForHR(rc);
return store;
}
internal static void SetupLauncher(Form form) {
IntPtr handle = form.Handle;
var store = Store(handle);
SetValue (store, Key.AppId, "Stackoverflow.chain.process.pinning");
form.FormClosed += delegate { Cleanup(handle); };
}
internal static void SetupLaunchee(Form form) {
IntPtr handle = form.Handle;
var store = Store(handle);
SetValue (store, Key.AppId, "Stackoverflow.chain.process.pinning");
string exePath = System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath, "launcher.exe");
SetValue (store, Key.RelaunchCommand, exePath);
SetValue (store, Key.DisplayName, "Test");
form.FormClosed += delegate { Cleanup(handle); };
}
internal static void Cleanup(IntPtr handle) {
var store = Store(handle);
ClearValue (store, Key.AppId);
ClearValue (store, Key.RelaunchCommand);
ClearValue (store, Key.DisplayName);
}
}
关于c# - 将 "chained process"固定到任务栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48539789/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
我们有一个应用程序,它显示一个小的“总在最上面”窗口。一般来说,这工作得很好。与其他应用程序一样,当它处于事件状态时,任务栏将其显示为已选中。 现在将幻灯片模式下的 PowerPoint 添加到组合中
我刚刚用 java-swing 为我写了一个桌面时钟,我希望每次登录时该时钟都运行。 为此,我将我的 jar 文件添加到 start 文件夹,我让时钟开始运行。 但我的问题是 - 任务栏中显示的图标允
有谁知道如何在任务栏中为程序设置自定义图标? 我知道您可以创建程序的快捷方式,以便在程序的左上角获取您想要的任何图标(引用下图),但如何让程序在任务栏中获取新图标? 最佳答案 任务栏中显示的图标是可执
我想知道任何类型的 API 或解决方法(例如脚本或注册表),以将 Windows 任务栏移动(或调整大小)到另一个位置,包括另一个显示器(如果是双显示器)。当然,我们可以使用鼠标移动任务栏,但我想通过
如标题所示,是否有任何 Win32 API 可以做到这一点? 最佳答案 不要这样做。 我 99% 确信没有官方 API,这与没有 programmatic access to the old Star
我正在编写一个小程序来解决与 16 位程序的兼容性问题。此修复是关闭 explorer.exe,因为 explorer 会覆盖程序中的某些调色板。之后,我们重新打开资源管理器。 当使用 .bat 文件
Windows 7 任务栏按钮绘制在阴影背景上。颜色阴影以某种方式对鼠标在按钮上的位置使用react。 我想在我的应用程序中使用这样的按钮。我该怎么做? 最佳答案 也许试试 绘制主题背景 http:/
我正在尝试创建一个由在一个窗口中运行的选项卡(而不是浏览器选项卡)组成的任务栏。 我需要跟踪每个选项卡中发生的事情,每个选项卡都有单独的面包屑。(为此,我想也许在每个选项卡的浏览器中使用一个 cook
我创建了没有任务栏的 WinCE 6.0 镜像。所以所有应用程序都最大化到全屏。我想创建自己的应用程序,如任务栏。我只想向这个任务栏添加几个按钮。但我希望其他处于最大化模式的应用程序不要隐藏此任务栏。
我是中级 jquery 经验,所以我需要一个很棒的界面演示的帮助: Demo 但我不知道为什么它不拖到具有相同 ID 的“#drophere”的其他 div。请让它像 Windows 任务栏一样工作。
我正在使用 JFrame 为桌面应用程序创建 GUI。我使用此代码根据平台屏幕的分辨率设置的 GUI 的大小。 this.setSize(this.getToolkit().getScreenSize
首先,我知道 SO 中有一个类似措辞的问题,但没有得到正确回答,围绕它的大部分讨论都落在了“你不应该那样做”上。 所以让我们从基础开始。为什么需要这个。 我在一家公司工作,该公司向我们的员工分发了几十
我想弄清楚如何在任务栏上显示进度。通过 PowerShell。 据我了解,我应该使用这样的东西: $Progress = [System.Windows.Shell.TaskbarItemInfo]:
是否可以从 Win7 任务栏捕获“实时”缩略图?我想在我的应用程序中显示此预览(另一个窗口的),但如何使用 .NET 提取这些预览? 最佳答案 是的。 MSDN Magazine explains h
我想在 C# 中模拟类似于 Windows 任务栏的东西。我想要一个表格底部的栏(我的意思是主表格)。当我打开新表格时,表格名称放在栏上,当我打开另一个新表格时,新表格名称放在栏上......另一方面
我使用 tabcontrols 创建了一个任务栏,它的工作方式与 Windows 任务栏类似。我想让我自己的任务栏固定在窗口的顶部。 它不应该是可移动的、可调整大小的,并且应该“停靠”到顶部。 最佳答
我们有一个主应用程序,它加载了几个插件,这些插件有自己的图标和子窗口。 问题出在 Windows 7 中,任务栏中的图标始终是主应用程序的图标,即使在子窗口中也是如此。但是,Alt+Tab 菜单会显示
我想为 Windows 制作一个二进制时钟。但我希望它替换默认时钟(有 2 个时钟不是最佳选择)。 因此,其中一种方法就是在旧时钟之上绘制我的二进制时钟。我怎么做?允许使用外部库。 我试过这样的东西:
为了简洁起见:我正在尝试实现 this使用 wxPython,但我正在努力将该代码放入基于 wxPython 的脚本中。 我的简单 PyQt 测试代码运行良好。这是: from PyQt4 impor
我是一名优秀的程序员,十分优秀!