zettend
@zettend
Разрабатываю крутые сайты и сервисы

Как сделать автоввод пары Логин/Пароль в стороннем приложении?

Здравствуйте.
У меня есть программа, которая для входа требует пару Логин/Пароль, но мне надо сделать авторизацию по Номеру телефона.
Грубо говоря мне нужно, что-бы моя программа вводила Логин/Пароль в формы другой программы. Такой функционал я видел у менеджеров паролей, каким способом можно это реализовать?
  • Вопрос задан
  • 73 просмотра
Решения вопроса 1
zettend
@zettend Автор вопроса
Разрабатываю крутые сайты и сервисы
В общем решил проблему использованием AutoHotkey.
Не самое безопасное решение, но о безопасности речи и не было)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@cicatrix
было бы большой ошибкой думать
У нас Exchange подтупливает, вот кликер на кнопочку ОК в одном из окон Outlook.
Собственно, у вас всё то же самое, только надо будет ещё два текстбокса в нужном окне найти и WM_SETTEXT соответствующий туда послать перед кликом:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace OutlookClicker
{
    class Program
    {
        delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);

        [DllImport("user32.dll")]
        static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn, IntPtr lParam);

        [DllImport("user32.dll")]
        private static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr lParam);

        private delegate bool EnumWindowProc(IntPtr hwnd, IntPtr lParam);

        private static IEnumerable<IntPtr> EnumerateProcessWindowHandles(int processId)
        {
            var handles = new List<IntPtr>();

            foreach (ProcessThread thread in Process.GetProcessById(processId).Threads)
                EnumThreadWindows(thread.Id,
                    (hWnd, lParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero);

            return handles;
        }

        private static List<IntPtr> GetAllChildHandles(IntPtr hwnd)
        {
            List<IntPtr> childHandles = new List<IntPtr>();

            GCHandle gcChildhandlesList = GCHandle.Alloc(childHandles);
            IntPtr pointerChildHandlesList = GCHandle.ToIntPtr(gcChildhandlesList);

            try
            {
                EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
                EnumChildWindows(hwnd, childProc, pointerChildHandlesList);
            }
            finally
            {
                gcChildhandlesList.Free();
            }

            return childHandles;
        }

        private static bool EnumWindow(IntPtr hWnd, IntPtr lParam)
        {
            GCHandle gcChildhandlesList = GCHandle.FromIntPtr(lParam);

            if (gcChildhandlesList == null || gcChildhandlesList.Target == null)
            {
                return false;
            }

            List<IntPtr> childHandles = gcChildhandlesList.Target as List<IntPtr>;
            childHandles.Add(hWnd);

            return true;
        }

        private const uint WM_GETTEXT = 0x000D;
        private const uint BM_CLICK = 0x00F5;

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

        [STAThread]
        static void Main(string[] args)
        {
            while (true)
            {
                foreach (var handle in EnumerateProcessWindowHandles(Process.GetProcessesByName("Outlook").First().Id))
                {
                    StringBuilder message = new StringBuilder(1000);
                    SendMessage(handle, WM_GETTEXT, message.Capacity, message);
                    if (message.ToString() == "Windows Security")
                    {
                        var children = GetAllChildHandles(handle);
                        foreach (var child in children)
                        {
                            StringBuilder childtext = new StringBuilder(1000);
                            SendMessage(child, WM_GETTEXT, message.Capacity, childtext);
                            if (childtext.ToString() == "OK")
                            {
                                SendMessage(child, BM_CLICK, 0, null);
                                break;
                            }
                        } // enum children
                        break;
                    } // if our window
                } // enum windows
            } // while
        } // Main
    } // class Program
} // namespace
Ответ написан
Попробовать winapi, находить заголовок окна, формы и подставлять значения в поля.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы