Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 27.09.2013
Сообщений: 5
1

Как реализовать в WPF захват нажатия мыши вне окна моего приложения?

27.09.2013, 12:21. Просмотров 2254. Ответов 8
Метки нет (Все метки)


как реализовать в WPF захват нажатия мыши вне окна моего приложения, когда мое приложения неактивна, помогите пожалуйста
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.09.2013, 12:21
Ответы с готовыми решениями:

Событие нажатия лев. кнопки мыши вне модального окна.
При открытой модальной форме нужно отследить событие нажатия левой кнопки мыши вне этого окна....

Как получить HWND окна моего приложения?
создал Win32ConsoleApplication и нжно из программы получить егодискриптор только без FindWindow......

MVVM WPF и обработка нажатия мыши
На данный момент у меня есть дилемма. Есть Canvas с эллипсами <ItemsControl Grid.Column="0"...

Эмуляция нажатия кнопок вне активоного окна
Как сделать чтобы при нажатии на F1 срабатывало действие, то есть эмуляция нажатия кнопок вне...

8
Эксперт Python
4433 / 1868 / 342
Регистрация: 17.03.2012
Сообщений: 9,640
Записей в блоге: 5
27.09.2013, 14:42 2
Никак. Это делается через хуки (winapi).
0
0 / 0 / 0
Регистрация: 27.09.2013
Сообщений: 5
27.09.2013, 14:55  [ТС] 3
а как примерно?
0
962 / 765 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
27.09.2013, 15:17 4
как-то так:
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
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Interop;
using System.Xml.Serialization;
 
namespace System.Windows.Input
{
    /// <summary>
    ///
    /// </summary>
    [Serializable]
    public class HotKey : IDisposable
    {
        private HwndSource m_HandleSource = null;
 
        #region Win API
 
        private const int WM_HOTKEY = 0x312;
 
        [DllImport("user32.dll", EntryPoint = "RegisterHotKey", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool apiRegisterHotKey(IntPtr hWnd, int id, ModifierKeys fsModifiers, int vk);
 
        [DllImport("user32.dll", EntryPoint = "UnregisterHotKey", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool apiUnregisterHotKey(IntPtr hWnd, int id);
 
        #endregion Win API
 
        /// <summary>
        ///
        /// </summary>
        public event EventHandler<HandledEventArgs> Pressed;
 
        /// <summary>
        ///
        /// </summary>
        public HotKey()
            : this(Key.None, ModifierKeys.None)
        {
        }
 
        /// <summary>
        ///
        /// </summary>
        /// <param name="key"></param>
        /// <param name="modifier"></param>
        public HotKey(Key key, ModifierKeys modifier)
        {
            this.Key = key;
            this.Modifier = modifier;
 
            this.m_HandleSource = new HwndSource(new HwndSourceParameters());
            this.m_HandleSource.AddHook(HwndSourceHook);
            this.m_HandleSource.Disposed += (o, e) =>
            {
                if (!this.IsEmpty)
                {
                    apiUnregisterHotKey(this.m_HandleSource.Handle, this.RawHotKey);
                }
                this.IsRegistered = false;
            };
        }
 
        private IntPtr HwndSourceHook(IntPtr hwnd, int message, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            if (message == WM_HOTKEY)
            {
                if (lParam.ToInt32() == this.RawHotKey)
                {
                    var handledEventArgs = new HandledEventArgs();
 
                    if (this.Pressed != null)
                    {
                        this.Pressed(this, handledEventArgs);
                        handled = handledEventArgs.Handled;
                    }
 
                    return new IntPtr(1);
                }
            }
 
            return IntPtr.Zero;
        }
 
        /// <summary>
        /// Defines a system-wide hot key.
        /// </summary>
        /// <param name="window">The window that will receive messages generated by the hot key.</param>
        public void Register()
        {
            if (this.IsEmpty)
                throw new Exception("HotKey is empty!");
 
            this.Unregister();
 
            var intKey = KeyInterop.VirtualKeyFromKey(this.Key);
            this.IsRegistered = apiRegisterHotKey(this.m_HandleSource.Handle, this.RawHotKey, this.Modifier, intKey);
 
            if (!this.IsRegistered)
                throw new ApplicationException("HotKey (" + this + ") already in use");
        }
 
        /// <summary>
        /// Frees a hot key previously registered by the calling thread.
        /// </summary>
        public void Unregister()
        {
            if (this.m_HandleSource != null && !this.m_HandleSource.IsDisposed && !this.IsEmpty)
                apiUnregisterHotKey(this.m_HandleSource.Handle, this.RawHotKey);
 
            this.IsRegistered = false;
        }
 
        /// <summary>
        /// <see cref="System.Dispose"/>
        /// </summary>
        public void Dispose()
        {
            this.Unregister();
 
            if (this.m_HandleSource != null && !this.m_HandleSource.IsDisposed)
            {
                this.m_HandleSource.RemoveHook(HwndSourceHook);
                this.m_HandleSource.Dispose();
            }
            this.m_HandleSource = null;
 
            this.Modifier = ModifierKeys.None;
            this.Key      = Key.None;
            this.Tag      = null;
            this.Pressed  = null;
        }
 
        ~HotKey()
        {
            Dispose();
        }
 
        /// <summary>
        ///
        /// </summary>
        [XmlAttribute]
        public Key Key { get; set; }
 
        /// <summary>
        ///
        /// </summary>
        [XmlAttribute]
        public ModifierKeys Modifier { get; set; }
 
        /// <summary>
        ///
        /// </summary>
        [XmlIgnore]
        public bool IsRegistered { get; private set; }
 
        /// <summary>
        ///
        /// </summary>
        [XmlIgnore]
        public int RawHotKey
        {
            get { return KeyInterop.VirtualKeyFromKey(this.Key) << 16 | (int)this.Modifier & 0xFFFF; }
        }
 
        /// <summary>
        ///
        /// </summary>
        [XmlIgnore]
        public object Tag { get; set; }
 
        /// <summary>
        ///
        /// </summary>
        public bool IsEmpty
        {
            get { return this.Key == Key.None || this.Modifier == ModifierKeys.None; }
        }
 
        /// <summary>
        ///
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public override bool Equals(object obj)
        {
            if (!(obj is HotKey))
                return false;
            var mhotKey = obj as HotKey;
            return (this.Key == mhotKey.Key && this.Modifier == mhotKey.Modifier);
        }
 
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public override int GetHashCode()
        {
            return this.RawHotKey ^ this.RawHotKey;
        }
 
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            if (this.Key == Key.None)
                return "(Empty)";
 
            if (this.Modifier == ModifierKeys.None)
                return this.Key.ToString();
 
            var modstr = this.Modifier.ToString().Replace(',', '+');
            return modstr + "+" + this.Key;
        }
    }
}
Пример использования:
C#
1
2
3
4
5
6
var hotKey = new HotKey(Key.S, ModifierKeys.Control);
hotKey.Pressed += (ob, ea) => {
    MessageBox.Show((ob as HotKey).ToString());
    ea.Handled = true;
};
hotKey.Register();
0
0 / 0 / 0
Регистрация: 27.09.2013
Сообщений: 5
27.09.2013, 15:25  [ТС] 5
а послед кусок куда поставить?

Добавлено через 5 минут
нужен срочно помогите
0
962 / 765 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
27.09.2013, 15:28 6
тьфу, сори, не то - это реализация "горячих клавиш" а с мишкой, надо по другому.
вот пример http://stackoverflow.com/quest... nt-handler
0
0 / 0 / 0
Регистрация: 27.09.2013
Сообщений: 5
27.09.2013, 15:28  [ТС] 7
как?
0
0 / 0 / 0
Регистрация: 27.09.2013
Сообщений: 5
27.09.2013, 16:15  [ТС] 9
Спасибо большое
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.09.2013, 16:15

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

[WPF] WebBrowser имитация нажатия клика мыши
Всем привет, мне нужна рекомендация. Хочу написать бот для игры, по принципу кликера, но хочу что...

Отпускание кнопки мыши вне окна не обрабатывается
У меня при отпускании кнопки мыши должен срабатывать обработчик, но если пользователь перемещает...

Проверка CheckBox на галочку вне класса окна WPF
У меня есть окно, в котором есть три Checkbox, которые при отметке галочкой посылают пользователю...

Как реализовать изменения внутри окна после нажатия некой кнопки?
Всем доброго времени суток. Небольшая проблема. Худо бедно разобрался с Windows forms на c++,...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.