我的 C# 程序遇到了一些问题。我想创建秒表(从某个值开始倒计时),即在按下某个键时启动。为了处理键,我使用低级键盘钩子。但是这个类有静态方法,所以如果我想从不同的类调用一个方法,那不是静态的,我必须创建一个新实例。随着倒计时,我想每滴答(秒)更改元素的Text
属性。问题是,当我必须在静态方法中创建一个新的类实例时TextBox
,如何更改TextBox
每个刻度(在类中)的属性,因此将不再响应以前的. 我的代码工作得很好,按键被识别,计时器正在倒计时并分别显示秒值Countdown
Countdown
TextBox
TextBox
MessageBox
'es(用于调试),但不会更改表单中的文本。
如果它可以帮助您理解我上面写的内容,我可以给您我的代码。就在评论里这么说吧。
提前感谢您的帮助。
编码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace stopwatch2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
InterceptKeys.InterceptInit();
}
private void Form1_Closing(object sender, CancelEventArgs e)
{
InterceptKeys.Unhook();
}
public void changeText(string text)
{
MessageBox.Show(text); //for debug
textBox1.Text = text;
}
class InterceptKeys
{
private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;
private static LowLevelKeyboardProc _proc = HookCallback;
private static IntPtr _hookID = IntPtr.Zero;
public static void InterceptInit()
{
_hookID = SetHook(_proc);
}
public static void Unhook()
{
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);
public static IntPtr HookCallback(
int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
Countdown timer = new Countdown(); //creating new instance
if ((Keys)vkCode == Keys.Home)
{
timer.StartTimer();
}
if ((Keys)vkCode == Keys.End)
{
timer.StopTimer();
}
}
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);
}
public partial class Countdown : Form1
{
public System.Windows.Forms.Timer timer1;
public int counter = 60;
public void StartTimer()
{
timer1 = new System.Windows.Forms.Timer();
timer1.Tick += new EventHandler(timer1_Tick);
timer1.Interval = 1000; // 1 second
timer1.Start();
changeText(counter.ToString());
}
public void timer1_Tick(object sender, EventArgs e)
{
counter--;
if (counter == 0)
counter = 60;
changeText(counter.ToString());
}
public void StopTimer()
{
timer1.Stop();
}
}
}
}