Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/22: Рейтинг темы: голосов - 22, средняя оценка - 4.68
15 / 9 / 1
Регистрация: 23.02.2012
Сообщений: 135

Как сделать форму, через которую можно совершать клики мышью

24.12.2012, 01:58. Показов 4550. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возможно ли это вообще?
Чтобы ее было видно, но нажатия мышкой проходили сквозь неё)

Добавлено через 42 минуты
Буду необычайно благодарен если выложите примерчик ^^
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.12.2012, 01:58
Ответы с готовыми решениями:

Можно ли сделать так, что сквозь форму можно было бы тыкать мышью по файлам?
Можно ли сделать так, что сквозь форму можно было бы тыкать мышью по файлам? Т.е. например, как в Bandicam можно спокойно с рабочим столом...

Как сделать форму в Excel в которую нужно вывести данные из Sheet-а, а затем пустить эту форму на принтер?
Как сделать форму в Excel в которую нужно вывести данные из Sheet-а, а затем пустить эту форму на принтер. Я новичок в этом деле. Спасибо!

Как программно управлять мышью (движение и клики)
Доброго времени суток господа программисты ! Вопрос вот какой, как программно можно управлять курсором мышки и её клавишами ? И ещё...

14
 Аватар для Doomer3D
180 / 180 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
24.12.2012, 07:25
Это невозможно. Разве только очень сильно через одно место и WinAPI.
1
15 / 9 / 1
Регистрация: 23.02.2012
Сообщений: 135
24.12.2012, 16:40  [ТС]
Цитата Сообщение от Doomer3D Посмотреть сообщение
Это невозможно. Разве только очень сильно через одно место и WinAPI.
А поподробнее?)

Добавлено через 2 часа 14 минут
Фуф. Вроде получилось найти окно под моим окном, как переслать сообщения туда?)
В C++ можно было бы напрямую передать параметры в SendMessage, а в C#?

Добавлено через 19 минут
Сделал обработчики MouseDown, MouseUp и MouseMove и в них:
C#
1
2
3
SendMessage(NextHWND, (UInt32)WMessages.WM_LBUTTONDOWN, (IntPtr)0, (IntPtr)0);
SendMessage(NextHWND, (UInt32)WMessages.WM_LBUTTONUP, (IntPtr)0, (IntPtr)0);
SendMessage(NextHWND, (UInt32)WMessages.WM_MOUSEMOVE, IntPtr.Zero, (IntPtr)MakeDWORD(e.Location));
Но ничего не происходит.... почему?

Добавлено через 2 минуты
Как будто сообщения в форму и не посылаются. Хотя я проверял через GetWindowTitle и вылезал заголовок нужного окна.

Добавлено через 10 минут
Почитал в msdn о этих сообщениях, оказывается надо координаты передавать в lParam, ну сделал так:
C#
1
2
3
SendMessage(hWnd, (UInt32)WMessages.WM_LBUTTONDOWN, IntPtr.Zero, (IntPtr)MakeDWORD(e.Location));
SendMessage(hWnd, (UInt32)WMessages.WM_LBUTTONUP, IntPtr.Zero, (IntPtr)MakeDWORD(e.Location));
SendMessage(hWnd, (UInt32)WMessages.WM_MOUSEMOVE, IntPtr.Zero, (IntPtr)MakeDWORD(e.Location));
Эффекта 0

Добавлено через 1 час 1 минуту
тема актуальна..
0
 Аватар для Doomer3D
180 / 180 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
24.12.2012, 16:49
А зачем оно собственно понадобилось? Ногти тоже можно стричь топором, но ножницами немного удобнее...
1
15 / 9 / 1
Регистрация: 23.02.2012
Сообщений: 135
24.12.2012, 16:55  [ТС]
Цитата Сообщение от Doomer3D Посмотреть сообщение
А зачем оно собственно понадобилось? Ногти тоже можно стричь топором, но ножницами немного удобнее...
Ну я хочу сделать помощника в одной браузерной игре для себя)
Там есть лотерея, я уже сделал форму полупрозрачную, правой кнопкой - срендомить числа, левой надо нажимать их сквозь форму..
Ну и еще кое-для каких дел такая штука давно нужна была.

По теме, окна отзываются на WM_CLOSE. В общем походу нужно искать хэндл нужного внутреннего элемента и ему посылать сообщение.. Ужас. Мне нужна уникальная конструкция (алгоритм) чтобы клики проходили сквозь форму независимо от того что под ней
0
 Аватар для Doomer3D
180 / 180 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
24.12.2012, 17:13
А такой вариант не подойдет? Создать программу, которая ловит горячие клавиши, назначить на эти клавиши определенные действия - "сгенерировать число и записать в буфер обмена". Результат будет тот же, но без ненужной формы.
0
15 / 9 / 1
Регистрация: 23.02.2012
Сообщений: 135
24.12.2012, 17:17  [ТС]
В буфер? А потом вставлять в блокнотик и нажимать сгенерированные цифры на сайте?
Мне нужно упростить себе игру в лотерею а не наоборот ))
Думал плагин сделать для хрома, не вышло.. Думал через webBrowser - неудобно и не вышло

Any idea?
0
 Аватар для Doomer3D
180 / 180 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
24.12.2012, 17:20
Еще можно рисовать поверх всех окон через Windows API.
1
15 / 9 / 1
Регистрация: 23.02.2012
Сообщений: 135
24.12.2012, 17:21  [ТС]
Вариант!
Поподробнее, если можно)
0
 Аватар для Doomer3D
180 / 180 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
24.12.2012, 17:40
Такой вот класс.

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
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
 
namespace Test
{
    public class ScreenDrawer : IDisposable
    {
        #region Declarations
 
        private IntPtr screenDC;                // хендл экрана
        private Graphics g;                     // GDI+
 
        private Color foreColor;                // цвет текста
        private Brush brush;                    // кисть
 
        #endregion
        #region Properties
 
        /// <summary>
        /// отображаемый текст
        /// </summary>
        public string Text { get; set; }
 
        /// <summary>
        /// шрифт
        /// </summary>
        public Font Font { get; set; }
 
        public Color ForeColor
        {
            get { return foreColor; }
            set
            {
                if (foreColor != value)
                {
                    foreColor = value;
                    if (brush != null)
                    {
                        brush.Dispose();
                    }
                    brush = new SolidBrush(foreColor);
                }
            }
        }
 
        #endregion
 
        #region Constructors
 
        /// <summary>
        /// конструктор
        /// </summary>
        public ScreenDrawer()
        {
            Text = "Sample";
            Font = new Font("Calibri", 36, FontStyle.Bold);
            ForeColor = Color.Orange;
        }
 
        /// <summary>
        /// деструктор
        /// </summary>
        ~ScreenDrawer()
        {
            Dispose();
        }
 
        #endregion
 
        #region Methods
 
        /// <summary>
        /// инициализация
        /// </summary>
        public void Init()
        {
            screenDC = CreateDC("DISPLAY", null, null, IntPtr.Zero);
            g = Graphics.FromHdc(screenDC);
        }
 
        /// <summary>
        /// рисование
        /// </summary>
        public void Draw()
        {
            g.DrawString(this.Text, this.Font, brush, 100, 100);
        }
 
        #endregion
 
        #region IDisposable Members
 
        public void Dispose()
        {
            if (g != null)
            {
                g.Dispose();
                g = null;
            }
            if (brush != null)
            {
                brush.Dispose();
                brush = null;
            }
        }
 
        #endregion
 
        #region API
 
        private enum TernaryRasterOperations : uint
        {
            SRCCOPY = 0x00CC0020,
            SRCPAINT = 0x00EE0086,
            SRCAND = 0x008800C6,
            SRCINVERT = 0x00660046,
            SRCERASE = 0x00440328,
            NOTSRCCOPY = 0x00330008,
            NOTSRCERASE = 0x001100A6,
            MERGECOPY = 0x00C000CA,
            MERGEPAINT = 0x00BB0226,
            PATCOPY = 0x00F00021,
            PATPAINT = 0x00FB0A09,
            PATINVERT = 0x005A0049,
            DSTINVERT = 0x00550009,
            BLACKNESS = 0x00000042,
            WHITENESS = 0x00FF0062,
            CAPTUREBLT = 0x40000000
        }
 
        [DllImport("gdi32.dll")]
        private static extern IntPtr CreateDC(string lpszDriver, string lpszDevice, string lpszOutput, IntPtr lpInitData);
 
        [DllImport("gdi32.dll", SetLastError = true)]
        private static extern IntPtr CreateCompatibleDC(IntPtr hdc);
 
        [DllImport("gdi32.dll")]
        private static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);
 
        [DllImport("gdi32.dll", ExactSpelling = true, PreserveSig = true, SetLastError = true)]
        private static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
 
        [DllImport("gdi32.dll")]
        private static extern bool DeleteObject(IntPtr hObject);
 
        [DllImport("gdi32.dll")]
        private static extern bool DeleteDC(IntPtr hdc);
 
        [DllImport("gdi32.dll")]
        private static extern bool StretchBlt(IntPtr hdcDest, int nXOriginDest, int nYOriginDest,
            int nWidthDest, int nHeightDest,
            IntPtr hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc,
            TernaryRasterOperations dwRop);
 
        [DllImport("gdi32.dll", EntryPoint = "BitBlt")]
        private static extern bool BitBlt(IntPtr hdcDest, int xDest,
                                         int yDest, int wDest,
                                         int hDest, IntPtr hdcSource,
                                         int xSrc, int ySrc, TernaryRasterOperations RasterOp);
 
        #endregion
    }
}
Использование:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private ScreenDrawer drawer;
 
...
 
        private void frmMain_Load(object sender, EventArgs e)
        {
            drawer = new ScreenDrawer();
            bgWorker.RunWorkerAsync();
        }
 
        private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            drawer.Init();
            while (!this.IsDisposed)
            {
                drawer.Draw();
                System.Threading.Thread.Sleep(0);
            }
        }
bgWorker - это BackgroundWorker

Добавлено через 19 секунд
Проверял - работает =)
1
15 / 9 / 1
Регистрация: 23.02.2012
Сообщений: 135
24.12.2012, 18:13  [ТС]
Большое спасибо

Добавлено через 15 минут
эмм. А ловить нажатия мышкой по нарисованному прямоугольнику (FillRectangle) уже не получится?(
0
 Аватар для Doomer3D
180 / 180 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
24.12.2012, 18:21
Через хуки:

http://www.codeproject.com/Art... Hooks-in-C
1
15 / 9 / 1
Регистрация: 23.02.2012
Сообщений: 135
24.12.2012, 18:52  [ТС]
А можно как-нибудь двойную буферизацию прикрутить к тому классу? Фон у текста мигает)
0
 Аватар для Doomer3D
180 / 180 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
24.12.2012, 19:18
Возможно, есть какие-то другие варианты рисования графики на экране - я просто не в курсе. А мерцает по каким-то иным причинам наверно. Возможно, стоит получить хендл процесса браузера и рисовать на нем. В общем, экспериментируйте.
1
15 / 9 / 1
Регистрация: 23.02.2012
Сообщений: 135
25.12.2012, 16:03  [ТС]
ДА ДЕТКА, ДА! ИИХА я сделал это ! сделал поиск окна под моим окном и отсылку сообщений ему и нужным дочерним контролам!
Теперь через форму можно кликать)
тему клоуз
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.12.2012, 16:03
Помогаю со студенческими работами здесь

Как сделать панель с кнопками внизу, которую можно проматывать
Подскажите, как сделать такую панель? Внизу кнопки и они все не входят на экран, можно промотать вправо. Как такое сделать?

Клики мышью
Есть возможность в PascalABC совершать клики мышью? например кликнул на правую картинку p:=0; кликнул на левую картинку p:=1;

Блокировать клики мышью?
Суть. Имеется WF приложение, прозрачная форма (пропускает клики и не сбивает фокус с основного окна). Реализация примерно такая: ...

Необходимо организовать базу данных, которую можно будет обновлять через интернет и через программу
Доброе всем время суток... Вот, собственно, вопрос.. Необходимо организовать базу данных, которую можно будет обновлять через...

Нарисовать квадраты, способные обрабатывать клики мышью
Здравствуйте, дамы и господа. Быть может я сейчас немного не правельно поставлю вопрос, но надеюсь суть вопроса вы поймёте... ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru