Как программно передать данные в приложение Windows? - PullRequest
1 голос
/ 04 июня 2009

Это со ссылкой на этот вопрос:

Как прочитать вывод и дать ввод в программу из программы c?

Я нашел ответ на поставленный выше вопрос очень полезным. Таким же образом, я могу сделать это для приложений Windows? Например, можно ли программно вводить данные в текстовое поле приложения Windows (например, приложения .net, C #)? Могу ли я выполнить действие по нажатию кнопки в программе?

Если это так, могу ли я сделать это из программы на C (с компилятором Tiny C или любым другим на платформе Windows)? Если нет, то как и на каком языке я могу это сделать? Пожалуйста, не принимайте это как глупый вопрос. Любые примеры кодов будут очень цениться.

Редактировать : Можно ли сделать то же самое с веб-приложениями и веб-страницами?

Ответы [ 4 ]

4 голосов
/ 04 июня 2009

Если вашему приложению в основном нужно манипулировать другими окнами, посылая нажатия клавиш и т. Д., Я бы использовал AutoIt . Это в основном функция именно этой работы, и она делает это очень хорошо.

Так что, возможно, вам стоит попробовать, потому что не каждая проблема - это гвоздь, и ее можно решить молотком (C #); -))

2 голосов
/ 04 июня 2009

Как указал Фретже, вы, безусловно, можете это сделать.

Это гораздо сложнее для приложений Windows. Поскольку отдельные элементы управления также считаются окнами, общее количество окон будет намного выше, чем вы могли бы ожидать; и поиск конкретного элемента управления, в который вы хотите отправить ввод, может занять много времени.

Но вы можете программно перемещать, изменять размер, проверять, заполнять, максимизировать или иным образом влиять на окна приложения, если вы знаете, какое из них является вашей целью.

Я написал код для процесса обнаружения несколько лет назад. Он обнаружил, что все окна целевого приложения, затем с использованием данных о размере и местоположении, произвел полупрозрачное наложение каждого дочернего окна вместе с номером дескриптора. Таким образом, я мог визуально определить, какой элемент управления использовался для какой ручки.

РЕДАКТИРОВАТЬ: Добавлен код. Это некоторый базовый код взаимодействия C #, который позволит вам легко вызывать user32.dll, который содержит fns, на которые ссылается fretje. Это просто дает вам основные вызовы для открытия и манипуляции; вам все равно придется проделать тяжелую работу по перечислению и изучению того, что вы найдете. Если вы можете найти сторонний пакет, который сделает эту работу за вас, избавьте себя от хлопот; Я сделал это только в качестве учебного опыта, и это было довольно трудоемко.

using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.Text;

namespace WinAPI
{
    [Flags] public enum WindowStyleFlags : uint
    {
        WS_OVERLAPPED      = 0x00000000,
        WS_POPUP           = 0x80000000,
        // more...
    }

    [Flags] public enum ExtendedWindowStyleFlags: int
    {
        WS_EX_DLGMODALFRAME    = 0x00000001,
        WS_EX_NOPARENTNOTIFY   = 0x00000004,
        // more...
    }

    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    public struct RECT
    {
        public int Left;
        public int Top;
        public int Right;
        public int Bottom;
    }

    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    public struct POINT
    {
        public int Left;
        public int Top;
    }

    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    public struct FLASHWINFO
    {
        public int cbSize;
        public IntPtr hwnd;
        public int dwFlags;
        public int uCount;
        public int dwTimeout;
    }

    public delegate int EnumWindowsCallback( IntPtr hwnd, int lParam );

    public class User32Dll
    {
        // Constants & fields
        public const int FLASHW_STOP = 0;
        public const int FLASHW_CAPTION = 0x00000001;
        // lots, lots more, web search for them...

        // Self-added, don't know if correct
        [DllImport("user32")]
        public extern static bool CloseWindow( IntPtr hWnd );
        [DllImport("user32")]
        public extern static IntPtr GetDesktopWindow();
        [DllImport("user32")]
        public extern static IntPtr GetForegroundWindow();
        [DllImport("user32")]
        public extern static int GetDlgItem( IntPtr hWnd, int wMsg );
        [DllImport("user32")]
        public extern static int GetListBoxInfo( IntPtr hWnd );
        [DllImport("user32")]
        public extern static bool MoveWindow( IntPtr hWnd, int X, int Y, int Width, int Height, bool Repaint );
        [DllImport( "user32" )]
        public static extern int SendMessage( IntPtr hWnd, int uMsg, IntPtr wParam, StringBuilder lpString );
        [DllImport("user32")]
        public static extern bool SetWindowPos( IntPtr hWnd, IntPtr afterWnd, int X, int Y, int cX, int cY, uint uFlags );

        [DllImport("user32")]
        public extern static int BringWindowToTop (IntPtr hWnd);
        [DllImport("user32")]
        public extern static int EnumWindows( EnumWindowsCallback lpEnumFunc, int lParam );
        [DllImport("user32")]
        public extern static int EnumChildWindows( IntPtr hWndParent, EnumWindowsCallback lpEnumFunc, int lParam );
        [DllImport( "user32.dll" )]
        public static extern int EnumThreadWindows( IntPtr hWndParent, EnumWindowsCallback callback, int lParam );
        [DllImport( "user32.dll" )]
        public static extern int FindWindow( string lpClassName, string WindowName );
        [DllImport( "user32.dll" )]
        public static extern int FindWindowEx( IntPtr hWnd, IntPtr hWnd2, string lpsz, string lpsz2 );
        [DllImport("user32")]
        public extern static int FlashWindow ( IntPtr hWnd, ref FLASHWINFO pwfi);
        [DllImport("user32")]
        public extern static IntPtr GetAncestor( IntPtr hWnd, uint gaFlags );
        [DllImport("user32", CharSet = CharSet.Auto)]
        public extern static int GetClassName ( IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
        [DllImport("user32", CharSet = CharSet.Auto)]
        public extern static uint GetWindowLong( IntPtr hwnd, int nIndex);
        [DllImport("user32")]
        public extern static int GetClientRect( IntPtr hWnd, ref RECT lpRect);
        [DllImport("user32")]
        public extern static int GetWindowRect( IntPtr hWnd, ref RECT lpRect);
        [DllImport("user32", CharSet = CharSet.Auto)]
        public extern static int GetWindowText( IntPtr hWnd, StringBuilder lpString, int cch );
        [DllImport("user32", CharSet = CharSet.Auto)]
        public extern static int GetWindowTextLength( IntPtr hWnd );
        [DllImport("user32")]
        public extern static int IsIconic(IntPtr hWnd);
        [DllImport("user32")]
        public extern static int IsWindowVisible( IntPtr hWnd );
        [DllImport("user32")]
        public extern static int IsZoomed(IntPtr hwnd);
        [DllImport("user32", CharSet = CharSet.Auto)]
        public extern static int PostMessage( IntPtr hWnd, int wMsg, int wParam, int lParam);
        [DllImport( "user32.dll" )]
        public static extern int RealGetWindowClass( IntPtr hWnd, StringBuilder pszType, uint bufferSize );
        [DllImport("user32")]
        public extern static int ScreenToClient( IntPtr hWnd, ref POINT lpPoint);
        [DllImport("user32", CharSet = CharSet.Auto)]
        public extern static int SendMessage( IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
        [DllImport("user32.dll")]
        public extern static int SetForegroundWindow (IntPtr hWnd);
        [DllImport( "user32.dll" )]
        public static extern int SetWindowText( IntPtr hWnd, string lpsz );
    }
}
2 голосов
/ 04 июня 2009

Вы можете перечислить все окна системы.
Вы можете отправлять сообщения Windows в любое окно.

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

К вашему сведению: Winspector - очень интересный инструмент, который также активно использует его (также для отладки или другой проверки в первую очередь окон, к которым вы пытаетесь получить программный доступ).

Вас также может заинтересовать this :

AutoIt v3 - это бесплатный BASIC-подобный язык сценариев, разработанный для автоматизации графического интерфейса Windows и общих сценариев. Он использует комбинацию смоделированных нажатий клавиш, движения мыши и манипуляций с окнами / элементами управления, чтобы автоматизировать задачи способом, невозможным или ненадежным для других языков (например, VBScript и SendKeys). AutoIt также очень маленький, автономный и будет работать на всех версиях Windows "из коробки" без навязчивых "рабочих циклов"!

0 голосов
/ 04 июня 2009

Проверьте следующий вопрос. Для этого существует множество инструментов от поставщиков и с открытым исходным кодом, поэтому вам не нужно кодировать в Win32 API.

автоматизирован-тестирование-из-окон-форм

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...