有谁知道如何在控制台应用程序中使用RegisterHotKey/UnregisterHotKey API调用?我假设设置/删除热键是相同的,但是如何在按下键时收到回叫?
我看到的每个例子都是针对Winforms和使用的protected override void WndProc(ref Message m){...},我无法使用.
SetupHotkey一个不同的线程也没有任何反应.有什么想法吗?
class Program
{
static void Main(string[] args)
{
new Hud().Init(args);
}
}
class Hud
{
int keyHookId;
public void Init(string[] args)
{
SetupHotkey();
InitPowershell(args);
Cleanup();
}
private void Cleanup()
{
HotKeyManager.UnregisterHotKey(keyHookId);
}
private void SetupHotkey()
{
keyHookId = HotKeyManager.RegisterHotKey(Keys.Oemtilde, KeyModifiers.Control);
HotKeyManager.HotKeyPressed += new EventHandler<HotKeyEventArgs>(HotKeyManager_HotKeyPressed);
}
void HotKeyManager_HotKeyPressed(object sender, HotKeyEventArgs e)
{
//never executed
System.IO.File.WriteAllText("c:\\keyPressed.txt", "Hotkey pressed");
}
private static void InitPowershell(string[] args)
{
var config = …Run Code Online (Sandbox Code Playgroud) 我对.NET编程和多线程一般都比较陌生,并且想知道是否可以使用.NET提供的BackgroundWorker来产生工作线程来在控制台应用程序中做一些工作?从在线的各种文档中,我看到这个类的意图更多的是面向UI的应用程序,你想在后台做一些工作,但保持UI响应,报告进度,取消处理,如果需要等.
在我的情况下,基本上我有一个控制器类,我想在多个工作线程中产生一些处理(限制使用信号量产生的最大工作线程数).然后我希望我的控制器类阻塞,直到所有线程都完成处理.所以在我启动一个工作线程做一些工作后,我希望线程能够在处理完成时通知控制器线程.我看到我可以使用后台工作者类,并处理事件DoWork和RunWorkerCompleted来实现这一点,但是想知道这是不是一个好主意?有没有更好的方法来实现这一目标?
首先请注意,此问题未标记为winforms或wpf或其他任何GUI特定的.这是故意的,你很快就会看到.
第二,对不起,如果这个问题有点长.我尝试将各种各样的信息汇集在一起,以便提供有价值的信息.然而,我的问题正好在"我想知道的事情"之下.
我的任务是最终了解.NET提供的在特定线程上调用委托的各种方法.
我正在寻找最通用的方法(不是Winforms或WPF特定的)来调用特定线程上的委托.
或者,换句话说:我会感兴趣的是,以及如何做各种各样的方式(例如通过WPF Dispatcher)相互利用; 也就是说,如果所有其他人都使用了一种用于跨线程委托调用的通用机制.
有很多与此主题相关的课程; 其中:
SynchronizationContext (in System.Threading)
如果我不得不猜测,那将是最基本的一个; 虽然我不明白它到底是做什么,也不知道它是如何使用的.
AsyncOperation&(in )
这些似乎是包装.不知道如何使用它们.AsyncOperationManager System.ComponentModelSynchronizationContext
WindowsFormsSynchronizationContext (in System.Windows.Forms)
的子类SynchronizationContext.
ISynchronizeInvoke (in System.ComponentModel)
由Windows窗体使用.(Control该类实现了这个.如果我不得不猜测,我会说这个实现可以使用WindowsFormsSynchronizationContext.)
Dispatcher&(in )
似乎后者是另一个子类,前者代表它.DispatcherSynchronizationContext System.Windows.ThreadingSynchronizationContext
有些线程有自己的消息循环,还有消息队列.
(MSDN页面关于消息和消息队列有一些介绍消息循环如何在系统级工作的背景信息,即消息队列作为Windows API.)
我可以看到如何为具有消息队列的线程实现跨线程调用.使用Windows API,您可以将消息放入特定线程的消息队列PostThreadMessage,其中包含调用某个委托的指令.消息循环 - 在该线程上运行 - 最终将到达该消息,并且将调用该委托.
根据我在MSDN上阅读的内容,线程不会自动拥有自己的消息队列.消息队列将变为可用,例如当线程创建窗口时.没有消息队列,线程没有消息循环是没有意义的.
那么,当目标线程没有消息循环时,是否可以进行跨线程委托调用?比方说,在.NET控制台应用程序中?(从这个问题的答案来看,我认为控制台应用确实不可能.)
.net winapi multithreading system.componentmodel synchronizationcontext
我感觉自己像一个总的菜鸟问这个,但无论如何,它在这里:
我想知道从不同线程同步事件的最简单方法是什么.
一些示例代码:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("# started on:" + Thread.CurrentThread.ManagedThreadId);
tt t = new tt();
t.First += new EventHandler(t_First);
t.Second += new EventHandler(t_Second);
Task task = new Task(new Action(t.Test));
task.Start();
while (true)
{
Console.ReadKey();
Console.WriteLine("# waiting on:" + Thread.CurrentThread.ManagedThreadId);
}
}
static void t_Second(object sender, EventArgs e)
{
Console.WriteLine("- second callback on:" + Thread.CurrentThread.ManagedThreadId);
}
static void t_First(object sender, EventArgs e)
{
Console.WriteLine("- first callback on:" + Thread.CurrentThread.ManagedThreadId);
}
class tt
{
public tt() …Run Code Online (Sandbox Code Playgroud)