[STAThread]语句是什么意思?

[ STAThread]
是一种线程模型,用在程序的入口方法上(在C#和VB.NET里是Main()方法),来指定当前线程的Apartment State 是 STA

[STAThread]是声明开始线程用的。
有时候要用一个第三方组件,如果不加[STAThread]的话,组件上有一些功能是无法使用的。加上[STAThread]就可以用了。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,WinForm 的键盘监听默认情况下在失去焦点的窗体上是不会生效的。这是因为键盘事件通常是由当前拥有焦点的控件处理的,而不是整个窗体。 如果你想要在失去焦点的窗体上仍然能够监听键盘事件,可以使用 `SetProcessDPIAware` 和 `SetWindowsHookEx` 这两个 Win32 API 来实现全局键盘监听。以下是一个示例代码: ```csharp using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Windows.Forms; namespace GlobalKeyboardListenerExample { public partial class MainForm : Form { private const int WH_KEYBOARD_LL = 13; private const int WM_KEYDOWN = 0x0100; private static LowLevelKeyboardProc _proc; private static IntPtr _hookID = IntPtr.Zero; public MainForm() { InitializeComponent(); } private void MainForm_Load(object sender, EventArgs e) { // 设置窗体为无边框样式 this.FormBorderStyle = FormBorderStyle.None; // 注册全局键盘监听 _proc = HookCallback; _hookID = SetHook(_proc); } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { // 移除全局键盘监听 UnhookWindowsHookEx(_hookID); } private static IntPtr SetHook(LowLevelKeyboardProc proc) { using (Process curProcess = Process.GetCurrentProcess()) using (ProcessModule curModule = curProcess.MainModule) { return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0); } } private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) { int vkCode = Marshal.ReadInt32(lParam); // 处理键盘按下事件 Console.WriteLine((Keys)vkCode); } return CallNextHookEx(_hookID, nCode, wParam, lParam); } [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool UnhookWindowsHookEx(IntPtr hhk); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr GetModuleHandle(string lpModuleName); [DllImport("user32.dll")] private static extern bool SetProcessDPIAware(); } static class Program { [STAThread] static void Main() { // 设置 DPI 感知 SetProcessDPIAware(); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } } } ``` 在上面的示例中,我们使用了 `SetWindowsHookEx` 函数来注册一个全局的键盘监听器。通过这种方式,窗体可以在失去焦点时仍然能够监听键盘事件。请注意,为了正确处理 DPI 缩放,我们还使用了 `SetProcessDPIAware` 函数。 请注意,全局键盘监听是一种高级的技术,并且可能会影响到系统的安全性和稳定性。在使用全局键盘监听时,请确保你理解并遵守相关的法律和规定,并避免滥用此功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值