Страница 1 из 1

Как добавить файл в Visual Studio без подтверждения Reload?

СообщениеДобавлено: 21 июн 2016, 21:53
i-programmer
Сейчас если открыта студия и в Юнити создаем файл (Create -> C# Script), то студия хочет, чтоб выбрал одно из действий Reload/ReloadAll/Ignore/IgnoreAll

Изображение

А можно ли как-то что-то где-то подкрутить, чтоб сразу автоматом без подтверждения файл подключался к проекту, как ReloadAll например и не доставал?

Аналогично при удалении файла из Юнити.

Re: Как добавить файл в Visual Studio без подтверждения Reload?

СообщениеДобавлено: 22 июн 2016, 21:00
Anonymyx

Re: Как добавить файл в Visual Studio без подтверждения Reload?

СообщениеДобавлено: 23 июн 2016, 00:37
i-programmer
Anonymyx писал(а):http://forum.unity3d.com/threads/how-to-disable-visual-studio-dialog-file-modification-detected.364919/



Печально, с января никаких уведомлений о прогрессе. Видимо и правда тяжко это сделать. Или до этого еще не дошёл таск)

Re: Как добавить файл в Visual Studio без подтверждения Reload?

СообщениеДобавлено: 23 июн 2016, 00:58
DbIMok
положить в Editor папку файлик FileModDialogCloser.cs
Синтаксис:
Используется csharp
using System;
using System.Runtime.InteropServices;
using UnityEditor;

[InitializeOnLoad]
public class FileModDialogCloser {

        [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
        static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        [DllImport("user32.dll")]
        static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);

        const string search = "File Modification Detected";
        static IntPtr hwnd;

        static void Check() {
                hwnd = FindWindowByCaption(IntPtr.Zero, search);
                if ((int)hwnd != 0) {
                        ShowWindow(hwnd, 5);
                        keybd_event(0x09, 0, 0, 0);
                        keybd_event(0x0D, 0, 0, 0);
                }
        }

        static FileModDialogCloser() {
                EditorApplication.update += Check;
        }
}

Re: Как добавить файл в Visual Studio без подтверждения Reload?

СообщениеДобавлено: 23 июн 2016, 08:29
i-programmer
DbIMok писал(а):положить в Editor папку файлик FileModDialogCloser.cs
Синтаксис:
Используется csharp
using System;
using System.Runtime.InteropServices;
using UnityEditor;

[InitializeOnLoad]
public class FileModDialogCloser : EditorWindow {

        [DllImport("user32.dll")]
        static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        [DllImport("user32.dll")]
        static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);

        const string search = "File Modification Detected";
        const byte VK_RETURN = 0x0D;
        const uint KEYEVENTF_KEYUP = 0x0002;
        IntPtr hwnd;

        void Check() {
                hwnd = FindWindowByCaption(IntPtr.Zero, search);
                if ((int)hwnd != 0) {
                        ShowWindow(hwnd, 5);
                        keybd_event(VK_RETURN, 0, 0, 0);
                        keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
                }
        }

        void Update() {
                Check();
        }
}



Это что-то не то. Во всяком случае оно не триггерит закрытие окна и эмуляцию нажатия на одну из кнопок. Все равно окно всплывает и надо нажать.

Re: Как добавить файл в Visual Studio без подтверждения Reload?

СообщениеДобавлено: 23 июн 2016, 14:36
DbIMok
обновил скрипт

Re: Как добавить файл в Visual Studio без подтверждения Reload?

СообщениеДобавлено: 23 июн 2016, 15:55
Zaicheg
Сходу без вникания не помогло.
Unity 5.3.4f1 (Target: WebPlayer), VS 2015, Windows 10 Ru
Сменить значение строки search под язык системы пробовал
http://screencast.com/t/51CYZYey3fD
http://screencast.com/t/AWGJuljB5

Re: Как добавить файл в Visual Studio без подтверждения Reload?

СообщениеДобавлено: 23 июн 2016, 16:41
DbIMok
русской студии нет под рукой. пробовал на "Безымянный — Блокнот" - работает
Unity 5.4.0b22, Windows 10 Ru
попробуй [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true, CharSet = CharSet.Auto)]

Re: Как добавить файл в Visual Studio без подтверждения Reload?

СообщениеДобавлено: 23 июн 2016, 18:51
i-programmer
DbIMok писал(а):обновил скрипт


Работает!
Жаль конечно, что нельзя вообще как-то обойтись без показа окна. Оно быстро конечно убирается, но, как я понимаю, это максимум что можно выжать из этого дела. Остальное - ждать разрабов VS for Unity

И, как я понимаю, чтоб сделать не Reload, а, например ReoladAll достаточно сделать не keybd_event(0x0D, 0, 0, 0);
а вот так keybd_event(0x09, 0, 0, 0); keybd_event(0x0D, 0, 0, 0); ? Типа Нажал на Tab и Enter. (и для игнора тоже табы)

Спасибо, Уважаемый. :ymapplause:

Re: Как добавить файл в Visual Studio без подтверждения Reload?

СообщениеДобавлено: 29 сен 2016, 21:45
eonyanov
А у меня вообще не вылазит окошко никакое, когда я создаю новый скрипт. :-?
И приходится его вручную импортировать.
Когда удаляю скрипт в Юнити, тоже в VS2015 ничего не происходит.
Как с этим бороться?
Заходил в настройки, галочка "Detect when file is changed ...." стоит.
Может у меня неправильная студия? Community 2015 какая-то...

Re: Как добавить файл в Visual Studio без подтверждения Reload?

СообщениеДобавлено: 11 май 2017, 05:51
DbIMok
Диалог не должен появляться, если создавать файл в VS. У юнити следилки много недостатков: нужно держать этот скрипт в каждом проекте, постоянно впустую проверяет, ищет по всем окнам, если запущено несколько экземпляров юнити редактора с таким скриптом и студия тормозит, может навставлять Enter'ов в код. Поэтому я закодил небольшой extension для Visual Studio 2017 FMDKiller.vsix. Принцип действия тот же. Увы, судя по подобным решениям (DPStudio VSCommands) более подходящего механизма обхода в студии не предусмотрено. Если кому-то надо расширение для предыдущих версий VS, то ниже есть код. Достаточно создать расширение из шаблона (закачав SDK для студии), скопипастить код, заменив если нужно неймспейс, имя класса и PackageGuidString на свои и сделать билд.
Синтаксис:
Используется csharp
using System;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Runtime.InteropServices;
using System.Text;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;

namespace FMDKiller {
        // auto generated set of attributes
        [PackageRegistration(UseManagedResourcesOnly = true)]
        [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
        [ProvideAutoLoad(UIContextGuids80.SolutionExists)]      // auto start when solution load
        [Guid(PackageGuidString)]
        [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "pkgdef, VS and vsixmanifest are valid VS terms")]
        public sealed class FMDKiller : Package {
                // auto generated, replace with your own value
                public const string PackageGuidString = "ca6f249c-847b-4acb-baaf-09c31e3b6546";

                #region Import WinAPI

                [DllImport("user32.dll", EntryPoint = "SetWindowsHookEx", SetLastError = true)]
                static extern IntPtr SetWindowsHookEx(int hookType, HookProc lpfn, IntPtr hMod, uint dwThreadId);

                [DllImport("kernel32.dll", EntryPoint = "GetCurrentThreadId")]
                static extern uint GetCurrentThreadId();

                [DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "GetClassName", SetLastError = true)]
                static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);

                [DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "GetWindowTextLength")]
                static extern int GetWindowTextLength(HandleRef hWnd);

                [DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "GetWindowText")]
                static extern int GetWindowText(HandleRef hWnd, StringBuilder lpString, int nMaxCount);

                [DllImport("user32.dll", EntryPoint = "CallNextHookEx")]
                static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

                [DllImport("user32.dll", EntryPoint = "UnhookWindowsHookEx", SetLastError = true)]
                [return: MarshalAs(UnmanagedType.Bool)]
                public static extern bool UnhookWindowsHookEx(IntPtr hhk);

                [DllImport("user32.dll")]
                static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

                [DllImport("user32.dll")]
                static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);

                #pragma warning disable 0649
                struct CWPSTRUCT {
                        public IntPtr wParam;
                        public IntPtr lParam;
                        public int msg;
                        public IntPtr hwnd;
                }
                #pragma warning restore 0649

                #endregion

                delegate IntPtr HookProc(int code, IntPtr wParam, IntPtr lParam);

                private const int WH_CALLWNDPROC = 4;

                private const int SHOW = 5;

                private const byte TAB = 0x09;

                private const byte RETURN = 0x0D;

                private const string DIALOG_BOX = "#32770";

                private static IntPtr hookPtr = IntPtr.Zero;

                private static HookProc hookProc;

                public FMDKiller() { }

                protected override void Initialize() {
                        base.Initialize();
                        ThreadHelper.Generic.Invoke(() => {
                                hookProc = HookProcImpl;
                                hookPtr = SetWindowsHookEx(WH_CALLWNDPROC, hookProc, IntPtr.Zero, GetCurrentThreadId());
                        });
                }

                private IntPtr HookProcImpl(int code, IntPtr wParam, IntPtr lParam) {
                        try {
                                if (code >= 0) {
                                        CWPSTRUCT w = (CWPSTRUCT)Marshal.PtrToStructure(lParam, typeof(CWPSTRUCT));
                                        if (w.msg == 1) {
                                                StringBuilder stringBuilder = new StringBuilder(128);
                                                int num = GetClassName(w.hwnd, stringBuilder, stringBuilder.Capacity);
                                                if (num != 0 && stringBuilder.ToString() == DIALOG_BOX) {
                                                        int capacity = GetWindowTextLength(new HandleRef(this, w.hwnd)) * 2;
                                                        StringBuilder stringBuilder2 = new StringBuilder(capacity);
                                                        GetWindowText(new HandleRef(this, w.hwnd), stringBuilder2, stringBuilder2.Capacity);
                                                        string caption = stringBuilder2.ToString();
                                                        if (caption == "File Modification Detected" ||
                                                            caption == "Обнаружено изменение в файле") {
                                                                ShowWindow(w.hwnd, SHOW);
                                                                keybd_event(TAB, 0, 0, 0);
                                                                keybd_event(RETURN, 0, 0, 0);
                                                        }
                                                }
                                        }
                                }
                        } catch (Exception e) {
                                Trace.WriteLine(string.Format(CultureInfo.CurrentCulture, "Exception: {0}", e.Message), "FMDKiller");
                        }
                        GC.KeepAlive(this);
                        return CallNextHookEx(IntPtr.Zero, code, wParam, lParam);
                }

                protected override void Dispose(bool disposing) {
                        if (hookPtr != IntPtr.Zero) {
                                UnhookWindowsHookEx(hookPtr);
                        }
                        base.Dispose(disposing);
                }
        }
}
 

Re: Как добавить файл в Visual Studio без подтверждения Reload?

СообщениеДобавлено: 11 май 2017, 11:24
Zaicheg
Спасибо )
На всякий случай, в русской 2017-студии окно выглядит так: https://www.screencast.com/t/sufDDuPHj3Q

Re: Как добавить файл в Visual Studio без подтверждения Reload?

СообщениеДобавлено: 26 окт 2017, 14:45
wmadwand
Спасибо, отрабатывает на ура! :-bd
Перевел для VS2015: https://bitbucket.org/wmadwand/fmdkillervs2015/src

FMDKiller_VS2015_Ext/FMDKiller_VS2015.vsix - файл расширения для установки
FMDKiller_VS2015 - исходники VS-проекта

Re: Как добавить файл в Visual Studio без подтверждения Reload?

СообщениеДобавлено: 02 мар 2018, 19:10
DbIMok
UnityVS научился автосинхронизировать солюшен, так что теперь ничего кроме него не нужно
3.5.0.2
Выпущено 04.12.2017
Новые функции
Интеграция:
Проекты Unity теперь автоматически повторно загружаются в Visual Studio при добавлении или удалении скриптов Unity.