【发布时间】:2022-11-15 19:01:06
【问题描述】:
我有这段代码,它在点击标签后运行一个函数(MouseTracker) 这个 MouseTracker,应该在对话框结果中按下 OK 后捕获鼠标位置 x 和 y。
namespace AdvancedStashHelper
{
public partial class Settings : Form
{
public int xTemp;
public int yTemp;
public Settings()
{
InitializeComponent();
}
private void MouseTracker()
{
while (true)
{
var result = MessageBox.Show("Move your cursor to position and press ENTER");
if (result == DialogResult.OK)
{
xTemp = MousePosition.X;
yTemp = MousePosition.Y;
}
break;
}
}
private void orbTransLabel_Click(object sender, EventArgs e)
{
Thread thread = new(MouseTracker);
thread.Start();
orbTransXPos.Text = xTemp.ToString();
}
private void orbAltLabel_Click(object sender, EventArgs e)
{
Thread thread = new(MouseTracker);
thread.Start();
}
}
}
这里的问题是,第一次单击标签时,没有任何反应,但是第二次单击后,该值会更新为先前的鼠标位置。
这应该是这样的:
- 点击标签
- 运行对话框,提示按回车键捕获鼠标位置
- 按确定后更新表单上的值
- 对具有不同鼠标位置值的所有标签执行此操作
【问题讨论】:
-
为什么你会觉得奇怪?
orbTransXPos.Text = xTemp.ToString();在您启动线程后立即运行,因为这是线程的重点。 -
这里不需要线程。 Winforms 具有用于跟踪窗体控件上的鼠标事件的内置事件。
-
为什么有一个线程?您想在另一个线程显示 MessageBox 之后在主线程中读取 xTemp。事情发生的顺序清晰。但是线程并行运行。因此,您已经通过使用线程将赛车条件构建到您的代码中,但您不需要做任何需要线程的事情。
-
老实说,我是初学者,还在学习中,你能帮帮我吗?