powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Клики сквозь форму
17 сообщений из 42, страница 2 из 2
Клики сквозь форму
    #39729050
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrKoderМожно, пожалуйста, пример
Я не так давно работаю с c# и wpf, еще не сталкивался с onPaintкак вывести в плагин onPaint тебе подскажут боее опытные в WPF.
Я помог переформулировать задачу, т. к. рисовать надо не в новом окне и потом бороться с перехватом мышки, а окне приложения.
...
Рейтинг: 0 / 0
Клики сквозь форму
    #39729542
MrKoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,
Хорошо, спасибо! Буду ждать, мб кто поможет
...
Рейтинг: 0 / 0
Клики сквозь форму
    #39729627
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrKoderPetro123,
Хорошо, спасибо! Буду ждать, мб кто поможет
разве вам не помог пост с 1 страницы?

вот готовое решение, я проверил, всё работает:

файл с вызовом WinAPI, в нём какая то сомнительная муть со словарем, которую явно надо выкинуть, оставляю это вам, мне то это нафиг не надо :) в данный момент
Код: 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.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;

namespace Meytes.WPF.Helpers
{
    internal static class WindowTransparentHelper
    {
        /// <summary> Справочник в котором хранятся старые состояния стиля окон </summary>
        private static readonly Dictionary<IntPtr, int> s_extendedStyleHwndDictionary
            = new Dictionary<IntPtr, int>();

        private const int WS_EX_TRANSPARENT = 0x00000020;
        private const int GWL_EXSTYLE = (-20);

        [DllImport("user32.dll", EntryPoint = "GetWindowLong")]
        private static extern int GetWindowLong(IntPtr hwnd, int index);

        [DllImport("user32.dll", EntryPoint = "SetWindowLong")]
        private static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle);

        /// <summary> Делает окно прозрачным для ввода мышки </summary>
        /// <param name="hwnd">HWND окна</param>
        public static void SetWindowExTransparent(IntPtr hwnd)
        {
            int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
            SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_TRANSPARENT);
            if (s_extendedStyleHwndDictionary.Keys.Contains(hwnd) == false)
            {
                s_extendedStyleHwndDictionary.Add(hwnd, extendedStyle);
            }
        }

        /// <summary> Отключает прозрачность для ввода мышки у окна</summary>
        /// <param name="hwnd">HWND окна</param>
        public static void UndoWindowExTransparent(IntPtr hwnd)
        {
            if (s_extendedStyleHwndDictionary.Keys.Contains(hwnd))
            {
                int extendedStyle = s_extendedStyleHwndDictionary[hwnd];
                SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle);
            }
        }
    }

    public class PopupTransparentBehavior
    {
        /// <summary> Прикрепляемое свойство зависимости отвечающее за прозрачность формы для ввода </summary>
        public static readonly DependencyProperty IsPopupEventTransparentProperty =
            DependencyProperty.RegisterAttached("IsPopupEventTransparent",
                                                typeof(bool),
                                                typeof(PopupTransparentBehavior),
                                                new UIPropertyMetadata(false, OnIsPopupEventTransparentPropertyChanged));

        public static bool GetIsPopupEventTransparent(DependencyObject obj) { return (bool)obj.GetValue(IsPopupEventTransparentProperty); }
        public static void SetIsPopupEventTransparent(DependencyObject obj, bool value) { obj.SetValue(IsPopupEventTransparentProperty, value); }

        private static void OnIsPopupEventTransparentPropertyChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
        {
            var element = target as FrameworkElement;
            var topParent = GetTopParent(element);
            var popupHwndSource = PresentationSource.FromVisual(topParent) as HwndSource;
            if (popupHwndSource == null) return;

            var newValue = (bool)e.NewValue;
            if (newValue)
                WindowTransparentHelper.SetWindowExTransparent(popupHwndSource.Handle);
            else
                WindowTransparentHelper.UndoWindowExTransparent(popupHwndSource.Handle);
        }

        public static FrameworkElement GetTopParent(FrameworkElement element)
        {
            return LogicalTreeHelper.GetChildren(element).Cast<FrameworkElement>().First();
        }
    }
}


App.xaml.cs файл, в котором происходит открытие 2 форм, 1 поверх другой, верхняя не взаимодействует с мышкой и прозрачна
Код: 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.
using Meytes.WPF.Helpers;
using System.Windows;

namespace WpfApp8
{
    public partial class App : Application
    {
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            //Открываем основное окно
            var mainWindow = new MainWindow();
            mainWindow.Show();
            //Инициализируем окно, оно должно быть обязательно AllowsTransparency=true
            var transparentWindows = new TransparentWindow()
            {
                WindowStyle = WindowStyle.None,
                AllowsTransparency=true,
                Opacity=.5,
                Owner = mainWindow,
                WindowStartupLocation = WindowStartupLocation.CenterOwner,
                Topmost = true,
            };
            //Открываем прозрачное окно
            transparentWindows.Show();
            //Включаем прозрачность
            transparentWindows.SetValue(PopupTransparentBehavior.IsPopupEventTransparentProperty, true);
        }
    }
}


App.xaml
Код: xml
1.
2.
3.
4.
<Application x:Class="WpfApp8.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Startup="Application_Startup"/>


Главное окно MainWindow.xaml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<Window x:Class="WpfApp8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <ListBox TextElement.FontSize="25">
        <ListBoxItem Content="Item1"/>
        <ListBoxItem Content="Item2"/>
        <ListBoxItem Content="Item3"/>
        <ListBoxItem Content="Item4"/>
        <ListBoxItem Content="Item5"/>
        <ListBoxItem Content="Item6"/>
    </ListBox>
</Window>


Прозрачное окно TransparentWindow.xaml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<Window x:Class="WpfApp8.TransparentWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="300" Width="300"
        Background="Transparent">
    <Window.Resources>
        <Style TargetType="{x:Type Button}" >
            <Setter Property="Margin" Value="0,0,5,5"/>
        </Style>
    </Window.Resources>
    <UniformGrid Rows="3" Columns="3" Margin="5,5,0,0" TextElement.FontSize="45">
        <Button Content="1"/>
        <Button Content="2"/>
        <Button Content="3"/>
        <Button Content="4"/>
        <Button Content="5"/>
        <Button Content="6"/>
        <Button Content="7"/>
        <Button Content="8"/>
    </UniformGrid>
</Window>
...
Рейтинг: 0 / 0
Клики сквозь форму
    #39729637
MrKoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes, просто
жесть

Извините, если это тупой вопрос, хотя скорее всего так и есть, но я сильно недавно работаю с этими вещами, поэтому есть определенные трудности

Если у меня есть MainWindow, в этом окне кнопка, по нажатию на которую должен по центру экрана появляться прицел (как раз таки который в свою очередь должен быть "прозрачным" для кликов мыши), то как мне прикрутить к этому проекту данную вещь?
Если я правильно вас понял, то Meytes.WPF.Helpers это просто отдельный файл, который должен подключаться к проекту. Он должен быть расширения c++ или c#?

И еще такая тема, для чего нужен в вашем примере App.xaml?
...
Рейтинг: 0 / 0
Клики сквозь форму
    #39729669
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотрите, вот накидал на коленке, может это поможет вам в реализации.
это только пример! Будут вопросы, задавайте.
внутри, проект для VS2017, и 0 вирусов, я надеюсь :)

ссылка на проект
...
Рейтинг: 0 / 0
Клики сквозь форму
    #39729731
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesвот готовое решение, я проверил, всё работает:на событие Paint без окна должно быть в разы меньше кода. Не знаю, че ты не захотел.
...
Рейтинг: 0 / 0
Клики сквозь форму
    #39729792
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Roman Mejtesвот готовое решение, я проверил, всё работает:на событие Paint без окна должно быть в разы меньше кода. Не знаю, че ты не захотел.в WPF есть событие Paint? если бы оно было, что именно было бы проще через него сделать?
...
Рейтинг: 0 / 0
Клики сквозь форму
    #39729804
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesв WPF есть событие Paint?ну может onRender.... Ты его лучше знаешь чем я).

Roman Mejtesчто именно было бы проще через него сделать?
Чтобы рисовать координатную сетку или масштабную линейку на карте я делаю так:
1. Класс
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
MyPaintGrid
{
   MyPaintGrid(Map map) 
   {
         this. map = map;
         (this.map as UserControl). Paint += МетодРисовать;
   } 
   void МетодРисовать(,,,,, 
} 


Причем карта компонент не моя, без исходников, и это типа плагин на моей стороне.
Всё
Вроде идеально)
...
Рейтинг: 0 / 0
Клики сквозь форму
    #39729806
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
Ты ругал WinForm в сравнении с WPF.
Но в винформ одну хотелку можно сделать в 50 разных способов.
В WPF есть другой способ для сабжа?
Мне интересно. А тебе?
...
Рейтинг: 0 / 0
Клики сквозь форму
    #39729810
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделайте мне кнопку в WinForms которая будет в форме снежинки серпинского, кнопка должна изменять размер, глубину детализации и хиттеститься только в рамках фрактала и 50ю способами.
странная у вас логика?
можно ли сделать всё это другим способом, безусловно. но зачем мне это делать, мне нужно сделать только 1
...
Рейтинг: 0 / 0
Клики сквозь форму
    #39729812
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesсделайте мнеок. Я подумаю.
А тебе просьба подсказать про мой код выше. Нужен Плагин.
...
Рейтинг: 0 / 0
Клики сквозь форму
    #39729813
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesно зачем мне это делатья понял. Тебе подписка на событие render не интересна.
Удачи!
...
Рейтинг: 0 / 0
Клики сквозь форму
    #39729817
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
Это то что я ищу?

Объект DrawingVisual
DrawingVisual — Упрощенный класс, используемый для отрисовки фигур, изображений и текста. Этот класс считается упрощенным, так как не предоставляет средств для работы с разметкой и обработку событий, что повышает его производительность. Поэтому этот класс идеально подходит для фоновых рисунков или клипов.
...
Рейтинг: 0 / 0
Клики сквозь форму
    #39729828
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не понимаю о каком коде выше вы пишите, DrawingVisual имеет смысл использовать, когда у вас большое количество элементов на экране. Так как при >10к элементов визуального дерева, может начать тормозить UI, а
Сам я его применял. когда у меня был сложный табличный контрол на 10к ячеек в каждой из которых могло быть еще N элементов виз.дерева в 1 момент на ViewPort'е, их использование дало увеличение перфоманса процентов на 10-15% при сохранении "универсальности" применения. Но какой смысл применения, в примере, я не пойму. Всё это только усложнит реализацию.

Опишите подробнее о чем речь, создайте новую тему, если она не про прознрачность окна, обсудим.
...
Рейтинг: 0 / 0
Клики сквозь форму
    #39729840
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesНо какой смысл применения, в примере, я не пойму. Всё это только усложнит реализацию.можете показать хотя бы схематично:
- основное приложение выдает Canvas в приложение плагин (в одном решении)
- в плагине:
canvas.Children.Add(new VisualHost { Visual = drawingVisual });
- в классе есть растр 64 на 64 курсора или прицела или...
...
Рейтинг: 0 / 0
Клики сквозь форму
    #39730125
MrKoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое всем за помощь!
Разобрался)
...
Рейтинг: 0 / 0
Клики сквозь форму
    #39731635
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrKoderклики проходили сквозь форму.для чего?
MrKoderТ.е. это окно должно быть просто информационным.
ИнфоОкно в другом процессе по отношению источнику информации приложению Б?
...
Рейтинг: 0 / 0
17 сообщений из 42, страница 2 из 2
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Клики сквозь форму
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]