C# 如何使用Process类打开便笺?

C# 如何使用Process类打开便笺?,c#,C#,我想用process类打开windows便笺,我已经知道如何使用计算器和绘图,但不知道如何使用便笺。当我把便签地址给它的时候,它不会打开。我使用64位windows。(windows窗体) 它给出了一个例外,即文件无法找到,但它存在于该位置。您必须从C:\Windows\Sysnative\StikyNot.exe打开该文件: System.Diagnostics.Process.Start(@"C:\Windows\Sysnative\StikyNot.exe"); 由于x64系统上的Sys

我想用process类打开windows便笺,我已经知道如何使用计算器和绘图,但不知道如何使用便笺。当我把便签地址给它的时候,它不会打开。我使用64位windows。(windows窗体)


它给出了一个例外,即文件无法找到,但它存在于该位置。

您必须从
C:\Windows\Sysnative\StikyNot.exe打开该文件

System.Diagnostics.Process.Start(@"C:\Windows\Sysnative\StikyNot.exe");

由于x64系统上的
System32
文件夹是合成的,因此直接调用它不起作用。您必须使用
Sysnative
名称将路径映射到'real'system32文件夹。

您必须从
C:\Windows\Sysnative\StikyNot.exe
打开文件:

System.Diagnostics.Process.Start(@"C:\Windows\Sysnative\StikyNot.exe");

由于x64系统上的
System32
文件夹是合成的,因此直接调用它不起作用。您必须使用
Sysnative
名称将路径映射到'real'system32文件夹。

此位置适用于win 8.1 64位

System.Diagnostics.Process.Start(@"C:\Windows\WinSxS\amd64_microsoft-windows-stickynotes-app_31bf3856ad364e35_6.3.9600.16384_none_de0517088d429664\StikyNot.exe");

如果它对您不起作用,您可以在windows驱动器中搜索StikyNot的其他位置

此位置在win 8.1 64位上对我有效

System.Diagnostics.Process.Start(@"C:\Windows\WinSxS\amd64_microsoft-windows-stickynotes-app_31bf3856ad364e35_6.3.9600.16384_none_de0517088d429664\StikyNot.exe");

如果它对您不起作用,您可以在windows驱动器中搜索StikyNot的其他位置。

如果您想到处玩,还可以使用以下程序作为参考。这似乎是一个非常好的例子

下面是一个调用示例。实现逻辑如下所示

public void NewNote(string someText)
{
var note = new StickyNote();
note.Activate();
note.Activated += (s, e) => { note.Signal(someText); };
}
功劳归于

使用系统;
使用系统诊断;
使用System.IO;
使用System.Runtime.InteropServices;
使用系统线程;
使用System.Windows.Forms;
命名空间日视图
{  
公共类粘滞便笺
{  
私有常量字符串m_ProcessName=“StikyNot”;
私有只读字符串m_ProcessFileName=Path.Combine(Environment.SystemDirectory,“StikyNot.exe”);
私有事件EventHandler m_Activated=委托{};
[DllImport(“user32.dll”)]
[返回:Marshallas(UnmanagedType.Bool)]
静态外部bool setforegroundindow(IntPtr hWnd);
公开作废激活()
{  
bool makeNewNote=true;
进程p=FindProcess();
if(p==null)
{  
p=开始进程();
如果(!NoteContainsText(p.MainWindowHandle))
{  
makeNewNote=false;
}  
}  
var state=新的StickyNoteState();
state.MakeNewNote=MakeNewNote;
state.StickyNoteProcess=p;
QueueUserWorkItem(激活,状态);
}  
私有无效激活(对象状态)
{  
var stickyNoteState=状态为stickyNoteState;
if(stickyNoteState.MakeNewNote)
{  
NewNote(stickyNoteState.StickyNoteProcess);
}  
OnActivated();
}  
私有进程StartProcess()
{  
var startInfo=new ProcessStartInfo(m_ProcessFileName);
进程p=进程启动(startInfo);
Thread.Sleep(200);//这是一个恼人的黑客行为。我还没有找到其他方法来确保进程启动。
返回p;
}  
私人作废新票据(流程p)
{  
SetForegroundWindow(p.MainWindowHandle);
信号(“^n”);
}  
///   
///奇怪的黑客发现笔记是否包含文本。
///   
///   
私有bool NoteContainsText(IntPtr句柄)
{  
string textOfClipboard=Clipboard.GetText();
信号(“^a”);
信号(“^c”);
信号(“{RIGHT}”);
string noteText=Clipboard.GetText().Trim();
如果(textOfClipboard==null)
{  
剪贴板.SetText(剪贴板的文本);
}  
return!string.IsNullOrEmpty(noteText);
}  
私有进程FindProcess()
{  
Process[]processs=Process.GetProcessesByName(m_ProcessName);
if(进程!=null&&processs.Length>0)
{  
返回进程[0];
}  
返回null;
}  
激活的内部无效()
{  
m_已激活(这是新的EventArgs());
}  
公共事件事件处理程序已激活
{  
添加{m_Activated+=value;}
删除{m_Activated-=value;}
}  
公共无效信号(字符串消息)
{  
SendKeys.SendWait(消息);
SendKeys.Flush();
}  
}  
公共类粘滞状态
{  
公共bool MakeNewNote{get;set;}
公共进程StickyNoteProcess{get;set;}
}  
}  
您还需要添加一个应用程序设置条目

<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
  <appSettings>  
    <add key="SendKeys" value="SendInput"/>  
  </appSettings>  
</configuration>  

如果您还想玩游戏,您可以使用以下程序作为参考。这似乎是一个非常好的例子

下面是一个调用示例。实现逻辑如下所示

public void NewNote(string someText)
{
var note = new StickyNote();
note.Activate();
note.Activated += (s, e) => { note.Signal(someText); };
}
功劳归于

使用系统;
使用系统诊断;
使用System.IO;
使用System.Runtime.InteropServices;
使用系统线程;
使用System.Windows.Forms;
命名空间日视图
{  
公共类粘滞便笺
{  
私有常量字符串m_ProcessName=“StikyNot”;
私有只读字符串m_ProcessFileName=Path.Combine(Environment.SystemDirectory,“StikyNot.exe”);
私有事件EventHandler m_Activated=委托{};
[DllImport(“user32.dll”)]
[返回:Marshallas(UnmanagedType.Bool)]
静态外部bool setforegroundindow(IntPtr hWnd);
公开作废激活()
{  
bool makeNewNote=true;