winforms 是否可以由用户在按键时定义特定坐标?

cclgggtu  于 2023-02-19  发布在  其他
关注(0)|答案(1)|浏览(141)

所以我写了一个小工具,有一点更容易访问的功能,因为没有热键。
现在我使用全局热键将鼠标移动到显示器上的特定位置并执行r/l单击。

KeyboardHook hook = new KeyboardHook();

hook.KeyPressed +=
new EventHandler<KeyPressedEventArgs>(hook_KeyPressed);

hook.RegisterHotKey(TestBox.ModifierKeys.Control, Keys.D1);

void hook_KeyPressed(object sender, KeyPressedEventArgs e)
        {
            Process[] p = Process.GetProcessesByName(".......");
            if (p.Count() > 0)
                SetForegroundWindow(p[0].MainWindowHandle);
            RightMouseClick(2000,110);
            System.Threading.Thread.Sleep(200);
            LeftMouseClick(2060,120);
        }

到目前为止一切顺利。现在我的问题是:
坐标是从我的右显示器(三重设置)。但如果我决定切换程序到我的左显示器?然后坐标不再匹配。我的方式将是这样的东西,但我不知道如何开始和实现这一点。
如果你第一次按下热键,有一个坐标检查。如果没有-〉要求设置他们。用户然后移动鼠标到第一个点,按F2,移动到第二个点,并再次按F2。所以坐标被保存,热键可以执行。

jc3wubiy

jc3wubiy1#

您的问题是关于多屏幕显示器上的屏幕坐标,重点是:
[...]如果我决定把程序切换到我左边的显示器上怎么办?
您是否考虑过使用Screen类来获取显示指标?使用Jeremy的link for GetWindowRect(),您可以让应用按时间间隔轮询程序位置变化,确定每个应用所在的屏幕,并相应地调整坐标。

**组合框的屏幕 Package **

class ScreenItem
{
    public ScreenItem(Screen screen) => Screen = screen;
    public Screen Screen { get; }
    string _displayName = null;
    public string DisplayName
    {
        get => _displayName?? Screen.DeviceName.Substring(Screen.DeviceName.LastIndexOf('\\') + 1);
        set => _displayName = value;
    }
    public override string ToString()
    {
        List<string> builder= new List<string>();
        builder.Add($"{nameof(Screen.Primary)} : {Screen.Primary}");
        builder.Add($"{nameof(Screen.Bounds)} : {Screen.Bounds}");
        builder.Add($"{nameof(Screen.WorkingArea)} : {Screen.WorkingArea}");
        return 
            string.Join(Environment.NewLine, builder.ToArray()
            .Select(_ => $"\t{_}"))
            + Environment.NewLine;
    }
}

列举

public MainForm()
{
    InitializeComponent();
    ScreenItem primary = null;
    foreach (var screenItem in Screen.AllScreens.Select(_ => new ScreenItem(_)))
    {
        if(screenItem.Screen.Primary)
        {
            primary = screenItem;
        }
        richTextBox.SelectionColor = Color.Navy;
        richTextBox.AppendText($"{screenItem.DisplayName}{Environment.NewLine}");
        richTextBox.SelectionColor = ForeColor;
        richTextBox.AppendText($"{screenItem}{Environment.NewLine}");
    }
}

相关问题