【发布时间】:2013-01-23 04:00:12
【问题描述】:
我的 C# 程序遇到了一些问题。我想创建秒表(从某个值开始倒计时),即在按下某个键时启动。为了处理键,我使用低级键盘钩子。但是这个类有静态方法,所以如果我想从不同的类调用一个方法,那不是静态的,我必须创建一个新实例。随着倒计时,我想每滴答(秒)更改TextBox 元素的Text 属性。问题是,当我必须在静态方法中创建Countdown 类的新实例时,如何在每个刻度(在Countdown 类中)更改TextBox 的属性,因此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();
}
}
}
}
【问题讨论】:
-
请务必显示(相关)代码。
-
如果不查看您的代码,很难确切地了解问题可能是什么。您正在实施什么样的计时器?这可能是重复的:stackoverflow.com/questions/3959107/… 尝试使用 System.Windows.Forms.Timer 而不是 System.Timers.Timer 或 System.Threading.Timer。
-
我已经添加了代码。感谢您的快速回复。 :)
标签: c# winforms static textbox instance