Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 13

Замена клика

24.05.2015, 00:54. Показов 1213. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Будьте добры, помогите пожалуйста в коде заменить левый клик мыши на нажатие буквы "k" на клавиатуре. Буду очень благодарен. Выкладываю код.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using Utilities;
 
namespace KaBoom
{
    public partial class KaBoom : Form
    {
        [DllImport("user32.dll")]
        static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, UIntPtr dwExtraInfo);
 
        [DllImport("user32.dll")]
        static extern bool ClientToScreen(IntPtr hWnd, ref Point lpPoint);
 
        private static bool run = true;
        private static bool shoot = false;
        private static Bitmap bmpScreenshot;
        private static Graphics gfxScreenshot;
        private static Color color;
        private static bool setHotkey = false;
        private static Keys hotkey = Keys.C;
 
        private class User32
        {
            [StructLayout(LayoutKind.Sequential)]
            public struct Rect
            {
                public int left;
                public int top;
                public int right;
                public int bottom;
            }
 
            [DllImport("user32.dll")]
            public static extern IntPtr GetWindowRect(IntPtr hWnd, ref Rect rect);
        }
 
        public KaBoom()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            globalKeyboardHook gkh = new globalKeyboardHook();
            gkh.KeyUp += new KeyEventHandler(keyUpEvent);
            gkh.KeyDown += new KeyEventHandler(keyDownEvent);
            CheckForIllegalCrossThreadCalls = false;
            Thread t = new Thread(new ThreadStart(screen));
            t.Start();
        }
        private void keyUpEvent(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == hotkey)
            {
                shoot = false;
            }
        }
        private void keyDownEvent(object sender, KeyEventArgs e)
        {
            if (setHotkey)
            {
                System.Diagnostics.Debug.WriteLine("New hotkey: " + e.KeyCode.ToString());
                hotkey = e.KeyCode;
                lbl_Hotkey.Text = hotkey.ToString();
                lbl_Hotkey.ForeColor = Color.Black;
                setHotkey = false;
                return;
            }
 
            if (shoot)
            {
                return;
            }
            if (e.KeyCode == hotkey)
            {                             
                try
                {
                    int x = (Screen.PrimaryScreen.Bounds.Size.Width / 2);
                    int y = (Screen.PrimaryScreen.Bounds.Size.Height / 2);
                    bmpScreenshot = new Bitmap(1, 1, PixelFormat.Format32bppArgb);
                    gfxScreenshot = Graphics.FromImage(bmpScreenshot);
                    gfxScreenshot.CopyFromScreen(x - 1, y + 1,0, 0, new Size(1, 1), CopyPixelOperation.SourceCopy);
                    Color c = bmpScreenshot.GetPixel(0, 0);
                    color = c;
                    System.Diagnostics.Debug.WriteLine("Start color: " + color.ToString());
                    bmpScreenshot.Dispose();
                    gfxScreenshot.Dispose();
                    shoot = true;
                }
                catch(Exception ee)
                {
                    System.Diagnostics.Debug.WriteLine("Keydown\r\n" + ee.Message);
                }
                
            }
        }
        private void click()
        {
            mouse_event(0x00000002, 0, 0, 0, UIntPtr.Zero);
            mouse_event(0x00000004, 0, 0, 0, UIntPtr.Zero);
        }
        private void screen()
        {
            while (run)
            {
                while (shoot)
                {
                    try
                    {
                        int x = (Screen.PrimaryScreen.Bounds.Size.Width / 2);
                        int y = (Screen.PrimaryScreen.Bounds.Size.Height / 2);
                        bmpScreenshot = new Bitmap(1, 1, PixelFormat.Format32bppArgb);
                        gfxScreenshot = Graphics.FromImage(bmpScreenshot);
                        gfxScreenshot.CopyFromScreen(x - 1, y + 1, 0, 0, new Size(1, 1), CopyPixelOperation.SourceCopy);
                         Color c = bmpScreenshot.GetPixel(0,0);
                        if (tolerrance(c))
                        {
                            System.Diagnostics.Debug.WriteLine("Boom old color: " + color.ToString() + " new color: " + c.ToString());
                            color = c;
                            Thread.Sleep(delayTrack.Value);
                            click();
                        }
                        bmpScreenshot.Dispose();
                        gfxScreenshot.Dispose();
                        Thread.Sleep(1);
                    }
                    catch(Exception ee)
                    {
                        System.Diagnostics.Debug.WriteLine("Screen catch\r\n" + ee.Message);
                    }
                }
             
            }
        
        }
        private bool between(int val, int min, int max)
        {
            if (val >= min && val <= max)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        private bool tolerrance(Color col)
        {
            int t = toleranceTrack.Value;
            if (col == color)
            {
                return false;
            }
            if (between(col.R,color.R-t,color.R+t))
            {
                return true;
            }
            if (between(col.G, color.G - t, color.G + t))
            {
                return true;
            }
            if (between(col.B, color.B - t, color.B + t))
            {
                return true;
            }
 
            if (between(col.A, color.A - t, color.A + t))
            {
                Text += " -" + color.A.ToString() + " - " + col.A.ToString();
                return true;
            }
            return false;
        }
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            run = false;
            shoot = false;
        }
        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            lbl_track_val.Text = toleranceTrack.Value.ToString();
        }
 
        private void panel1_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                setHotkey = true;
                lbl_Hotkey.ForeColor = Color.Blue;
            }
        }
 
        private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            this.Visible = true;
            this.WindowState = FormWindowState.Normal;
            trayIcon.Visible = false;
        }
 
        private void button1_Click_1(object sender, EventArgs e)
        {
            trayIcon.Visible = true;
            this.Visible = false;
        }
 
        private void delayTrack_Scroll(object sender, EventArgs e)
        {
            lbl_delayVal.Text = delayTrack.Value.ToString();
        }
 
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.ComponentModel;
namespace Utilities
{
    /// <summary>
    /// A class that manages a global low level keyboard hook
    /// </summary>
    class globalKeyboardHook
    {
        #region Constant, Structure and Delegate Definitions
        /// <summary>
        /// defines the callback type for the hook
        /// </summary>
        public delegate int keyboardHookProc(int code, int wParam, ref keyboardHookStruct lParam);
 
        public struct keyboardHookStruct
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }
 
        const int WH_KEYBOARD_LL = 13;
        const int WM_KEYDOWN = 0x100;
        const int WM_KEYUP = 0x101;
        const int WM_SYSKEYDOWN = 0x104;
        const int WM_SYSKEYUP = 0x105;
        #endregion
 
        #region Instance Variables
        /// <summary>
        /// The collections of keys to watch for
        /// </summary>
        public List<Keys> HookedKeys = new List<Keys>();
        /// <summary>
        /// Handle to the hook, need this to unhook and call the next hook
        /// </summary>
        IntPtr hhook = IntPtr.Zero;
        #endregion
 
        #region Events
        /// <summary>
        /// Occurs when one of the hooked keys is pressed
        /// </summary>
        public event KeyEventHandler KeyDown;
        /// <summary>
        /// Occurs when one of the hooked keys is released
        /// </summary>
        public event KeyEventHandler KeyUp;
        #endregion
 
        #region Constructors and Destructors
        /// <summary>
        /// Initializes a new instance of the <see cref="globalKeyboardHook"/> class and installs the keyboard hook.
        /// </summary>
        public globalKeyboardHook()
        {
            hook();
        }
 
        /// <summary>
        /// Releases unmanaged resources and performs other cleanup operations before the
        /// <see cref="globalKeyboardHook"/> is reclaimed by garbage collection and uninstalls the keyboard hook.
        /// </summary>
        ~globalKeyboardHook()
        {
            unhook();
        }
        #endregion
 
        #region Public Methods
        /// <summary>
        /// Installs the global hook
        /// </summary>
        /// 
        private static keyboardHookProc callbackDelegate;
        public void hook()
        {
            if (callbackDelegate != null) throw new InvalidOperationException("Can't hook more than once");
            IntPtr hInstance = LoadLibrary("User32");
            callbackDelegate = new keyboardHookProc(hookProc);
            hhook = SetWindowsHookEx(WH_KEYBOARD_LL, callbackDelegate, hInstance, 0);
            if (hhook == IntPtr.Zero) throw new Win32Exception();
        }
 
        /// <summary>
        /// Uninstalls the global hook
        /// </summary>
        public void unhook()
        {
            if (callbackDelegate == null) return;
            bool ok = UnhookWindowsHookEx(hhook);
            callbackDelegate = null;
        }
 
        /// <summary>
        /// The callback for the keyboard hook
        /// </summary>
        /// <param name="code">The hook code, if it isn't >= 0, the function shouldn't do anyting</param>
        /// <param name="wParam">The event type</param>
        /// <param name="lParam">The keyhook event information</param>
        /// <returns></returns>
        public int hookProc(int code, int wParam, ref keyboardHookStruct lParam)
        {
            if (code >= 0)
            {
                Keys key = (Keys)lParam.vkCode;
                KeyEventArgs kea = new KeyEventArgs(key);
                if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && (KeyDown != null))
                {
                    KeyDown(this, kea);
                }
                else if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && (KeyUp != null))
                {
                    KeyUp(this, kea);
                }
                if (kea.Handled)
                    return 1;
            }
            return CallNextHookEx(hhook, code, wParam, ref lParam);
        }
        #endregion
 
        #region DLL imports
        /// <summary>
        /// Sets the windows hook, do the desired event, one of hInstance or threadId must be non-null
        /// </summary>
        /// <param name="idHook">The id of the event you want to hook</param>
        /// <param name="callback">The callback.</param>
        /// <param name="hInstance">The handle you want to attach the event to, can be null</param>
        /// <param name="threadId">The thread you want to attach the event to, can be null</param>
        /// <returns>a handle to the desired hook</returns>
        [DllImport("user32.dll")]
        static extern IntPtr SetWindowsHookEx(int idHook, keyboardHookProc callback, IntPtr hInstance, uint threadId);
 
        /// <summary>
        /// Unhooks the windows hook.
        /// </summary>
        /// <param name="hInstance">The hook handle that was returned from SetWindowsHookEx</param>
        /// <returns>True if successful, false otherwise</returns>
        [DllImport("user32.dll")]
        static extern bool UnhookWindowsHookEx(IntPtr hInstance);
 
        /// <summary>
        /// Calls the next hook.
        /// </summary>
        /// <param name="idHook">The hook id</param>
        /// <param name="nCode">The hook code</param>
        /// <param name="wParam">The wparam.</param>
        /// <param name="lParam">The lparam.</param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        static extern int CallNextHookEx(IntPtr idHook, int nCode, int wParam, ref keyboardHookStruct lParam);
 
        /// <summary>
        /// Loads the library.
        /// </summary>
        /// <param name="lpFileName">Name of the library</param>
        /// <returns>A handle to the library</returns>
        [DllImport("kernel32.dll")]
        static extern IntPtr LoadLibrary(string lpFileName);
        #endregion
    }
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.05.2015, 00:54
Ответы с готовыми решениями:

Таймер и проверка клика
Привет всем. Как сделать проверку на нажатие кнопки мыши в таймере? private void timer1_Tick(object sender, EventArgs e) { ...

Ожидание клика на button
Есть три кнопки на форме, нужно чтоб цикл продолжал выполняться только после нажатия одной из этих кнопок Клики я объединил в один метод....

Обработчик програмного клика
Добрый день.Прошу помочь мне с написанием игры крестики-нолики. Код предоставляется public void Form2_Click(object sender, EventArgs...

3
 Аватар для Storm Screamer
4873 / 1440 / 116
Регистрация: 21.04.2013
Сообщений: 8,702
24.05.2015, 01:04
Лучший ответ Сообщение было отмечено ate3096 как решение

Решение

Ага, что у нас тут... триггер бот, реагирующий на цвета

Вот здесь вместо вызова mouse_event вызывай keybd_event.
C++
1
2
3
4
5
        private void click()
        {
            mouse_event(0x00000002, 0, 0, 0, UIntPtr.Zero);
            mouse_event(0x00000004, 0, 0, 0, UIntPtr.Zero);
        }
Соответственно, выше надо описать keybd_event, рядом с mouse_event.

https://msdn.microsoft.com/ru-... s.85).aspx
2
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 13
24.05.2015, 23:22  [ТС]
Благодарю за ответ. Еще одна небольшая просьба: помоги пожалуйста описать. Подскажи пожалуйста, каким образом задать определенную клавишу нажатия, а именно "k"?
0
 Аватар для Storm Screamer
4873 / 1440 / 116
Регистрация: 21.04.2013
Сообщений: 8,702
25.05.2015, 00:44
Цитата Сообщение от ate3096 Посмотреть сообщение
каким образом задать определенную клавишу нажатия, а именно "k"?
C++
1
2
3
4
5
6
7
8
9
10
11
     // Simulate a key press
         keybd_event( 0x4B,
                      0x4B,
                      KEYEVENTF_EXTENDEDKEY | 0,
                      0 );
 
      // Simulate a key release
         keybd_event( 0x4B,
                      0x4B,
                      KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                      0);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.05.2015, 00:44
Помогаю со студенческими работами здесь

отловить координаты клика
где лучше ловить координаты клика мышей- в событии MouseDown или в MouseClick? насколько я понимаю MouseClick=MouseDown +MouseUp?

Эмуляция клика мыши
Как эмулировать нажатие мыши на определенной точки на экране

координаты клика в форме
в программе задаются определенные X,Y. и если кликнуть по форме с координатами X,Y, происходит определенное событие. если координаты клика...

Имитация клика мышкой
Мне надо программно нажать на точку на экране, как это можно реализовать? Если пишу instance.Click(100, 100, 200, 200, &quot;Left&quot;,...

Имитация клика мыши
Доброго времени суток. Столкнулся с такой проблемой: Необходимо имитировать клик мышки в WebBrowser, в определенной координате - клик...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru