Nano Hash - криптовалюты, майнинг, программирование

Функция SendMessage из User32.dll не работает в Windows 8

Я разрабатываю часть программного обеспечения для извлечения некоторой информации из внешнего настольного приложения, дело в том, что я работаю в Windows 7 с использованием С#, и у меня есть работающее приложение, которое использует материал здесь:

Как я могу получить значения из окна класса ThunderRT6ListBox с использованием user32.dll в c#

Но проблема возникает, когда я тестирую одно и то же программное обеспечение с тем же внешним приложением в Windows 8, оно работает по-разному.

Я могу скопировать идентификатор обработчика элементов управления, но когда я использую функцию SendMessage, например, чтобы поместить новый текст в элемент управления редактирования (текстовое поле), ничего не происходит.

    public static void SetText(IntPtr HWnd, string strTextToSet)
    {
        var text = new StringBuilder(strTextToSet);
        SendMessage(HWnd, WM_SETTEXT, IntPtr.Zero, text);
    }

Есть ли какие-либо соображения в Windows 8, когда он использовал этот материал?

ОБНОВИТЬ:

Тем не менее это не работает. GetText работает, а SetText — нет.

Мой код:

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]        
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

    const uint WM_SETTEXT = 0x000C;

    public static string GetText(IntPtr hwnd)
    {
        var text = new StringBuilder(1024);
        if (SendMessageTimeoutText(hwnd, 0xd, 1024, text, 0x2, 1000, 0) != 0)
        {
            return text.ToString();
        }

        return "";
    }

    public static void SetText(IntPtr HWnd, string strTextToSet)
    {
        //var text = new StringBuilder(strTextToSet);
        IntPtr text = System.Runtime.InteropServices.Marshal.StringToCoTaskMemUni(strTextToSet);
        SendMessage(HWnd, WM_SETTEXT, IntPtr.Zero, text);
    }

ОБНОВЛЕНИЕ 2:

Код ошибки:

    ModApi.SetText(hwEdit, "foo_namE");

    //The textbox does not change

    int error_code = Marshal.GetLastWin32Error();

    //error_code is 5
19.09.2013

  • Каков результат GetLastError после того, как ничего не происходит? 19.09.2013
  • Это был лучший ответ, чем мой; лучше всего определить проблему, чем просто снести все это и добавить новое решение, как я сделал в своем ответе ниже. 19.09.2013
  • @Jcl Вы не можете позвонить GetLastError. Вы должны использовать SetLastError в пинвоке, а затем вызвать Marshal.GetLastWin32Error. 19.09.2013
  • Пожалуйста, покажите пинвок. Пожалуйста, расскажите нам, как вы получаете дескриптор окна. Пожалуйста, скажите нам, в какое окно вы тыкаете. Сообщите нам возвращаемое значение SendMessage. Пожалуйста, дайте нам знать, как мы можем воспроизвести поведение. 19.09.2013
  • @DavidHeffernan да, я не пытался дать решение проблемы, я просто пытался заставить оригинальный постер исследовать дальше, чем ничего не происходит. Думаю, это не сработало :-) (и да, вы действительно правы) 19.09.2013
  • Хорошо, я обновляю информацию о коде ошибки. Его значение равно 5. 19.09.2013
  • @videador, если вы проверите документацию MSDN в SendMessage вы увидите следующее: Когда сообщение блокируется UIPI, последней ошибке, полученной с помощью GetLastError, присваивается значение 5 (отказано в доступе). 20.09.2013
  • значение: есть проблема с привилегиями, возможно, дело в UAC... попробуйте запустить процесс с повышенными правами (то есть: запуск от имени администратора) 20.09.2013
  • Это было решением, спасибо Jcl. 20.09.2013

Ответы:


1

Решение было о UAC (User Access Control), мне нужно было запустить Visual Studio в режиме администрирования (или исполняемый файл, когда он будет собран).

20.09.2013
  • Только потому, что другое приложение работает с повышенными правами 21.09.2013
  • И как может работать текст wm_get? Это маловероятно, если вы не отправляете в другой процесс из цели wm_wettest. 21.09.2013
  • Я не понимаю вашего вопроса. 22.09.2013
  • Извините, мой планшет решил, что пишет лучше, чем я. Я хочу сказать, что если UAC заблокирует WM_SETTEXT, то он также заблокирует WM_GETTEXT. Так оба сообщения действительно отправлялись в одно и то же окно? 22.09.2013

  • 2

    Согласно этому (SendMessage WM_SETTEXT to TextBox не вызывает событие TextChanged) другой вопрос по SO, в моей системе в приложении форм Windows 8 работает следующее:

    //Declarations
            [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
            static extern IntPtr SendMessage(IntPtr hWnd, uint Msg,
                IntPtr wParam, IntPtr lParam);
    
            private const uint WM_SETTEXT = 0x000C;
    
    
    //SetText function
            public static void SetText(IntPtr HWnd, string strTextToSet)
            {
                IntPtr text = System.Runtime.InteropServices.Marshal.StringToCoTaskMemUni(strTextToSet);
                SendMessage(HWnd, WM_SETTEXT, IntPtr.Zero, text);
                System.Runtime.InteropServices.Marshal.FreeCoTaskMem(text);
    
            }
    
    19.09.2013
  • Ничего, кроме момента, я обновил код с вашими изменениями (параметр lParam), но он все еще не работает. 19.09.2013
  • Вы имели в виду CharSet.Auto, так как позвонили StringToCoTaskMemUni 19.09.2013
  • Дэвид, я не понял твоей ссылки на то, где должен измениться код? Я устанавливаю Charset в CharSet.Auto в атрибуте объявления - я больше нигде не вижу, что мне нужно его изменить. Спасибо! 19.09.2013
  • Видеадор. Для ясности, какой тип приложения вы создаете? Является ли это приложением Windows Forms, и если да, то на какую платформу вы ориентируетесь (x86, x64) и, ради интереса, какую версию Visual Studio вы используете? 19.09.2013
  • @JayTaplin напечатал не то. Должен был сказать CharSet.Unicode. Извиняюсь. Я также хотел бы, чтобы вы объяснили, почему ваш код что-то исправит. 19.09.2013
  • Джей, я работаю с Visual Studio Express 10 c#, framework NET 4.0 (насчет платформы я предполагаю x86, но я не знаю). Я собираюсь решить проблему с SeeLastError, спасибо, Дэвид. 19.09.2013
  • Дэвид - спасибо за отзыв о моем ответе. Что касается того, почему мой код должен что-то исправить, он был написан до того, как к вопросу были добавлены обновления № 2 и № 3, поэтому мало что можно было сказать о среде, в которой код терпел неудачу. Вот почему я признал выше, что найти основную причину было бы намного разумнее, чем просто использовать мой ответ. Однако до этого я предоставил код, который работал в моей системе, на основе вопроса, на который я ссылался в верхней части моего ответа. 20.09.2013
  • Исходный код в вопросе работает и в вашей системе. Здесь нечего продолжать. Добавление такого ответа не очень помогает. Что необходимо, так это тому, чтобы запрашивающий потратил время на создание репро-кейса. То, что спрашивающий тратит время, пытаясь сделать несколько вариантов пинвока, которые делают одно и то же, просто отвлекает от реальной задачи. В любом случае, это видео или сделать репродукцию. В противном случае никто не может помочь. 20.09.2013
  • Хорошо, спасибо за отзыв, Дэвид. Я новичок в попытке ответить на вопросы на этом сайте, поэтому я ценю информацию о процессе и процедуре. 20.09.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..