0 / 0 / 0
Регистрация: 28.01.2015
Сообщений: 7
1

Нажать на кнопку в другом приложении

28.01.2015, 13:37. Показов 1741. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня!

Из программы запускается процесс стороннего приложения, открывается вордовский документ и запускается макрос с закрытым кодом, который в ходе своей работы выкидывает окошко с вопросом, где необходимо нажать кнопку Да/Нет и программа ждет, пока не нажмут на одну из кнопок.

Проблема в том, чтобы запустить процесс работы макроса в отдельном потоке, чтобы в основном отлавливать окошко и нажимать на кнопку програмно.

Как или когда вызвать функцию ClickMacroButton, чтобы программа не висла в ожидании тыка на кнопку?

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
public class MacroParams
    {
        public object oApp;
        public object[] oRunArgs;
 
        public MacroParams(object oApp, object[] oRunArgs)
        {
            this.oApp = oApp;
            this.oRunArgs = oRunArgs;
        }
    }
 
public partial class MainWindow : Window
    {
 
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string className, string windowName);
 
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
 
        const int WM_LBUTTONDOWN = 0x0201;
        const int WM_LBUTTONUP = 0x0202;
 
        private static System.Threading.AutoResetEvent waitHandle = new System.Threading.AutoResetEvent(false);
 
        public static Word.Application Word = new Word.Application();
 
        static void RunMacro(object obj)
        {
            if (obj is MacroParams)
            {
                MacroParams pr = (MacroParams)obj;
                
                pr.oApp.GetType().InvokeMember("Run",
                    System.Reflection.BindingFlags.Default |
                    System.Reflection.BindingFlags.InvokeMethod,
                    null, pr.oApp, pr.oRunArgs);
                waitHandle.Set();
            }
        }
 
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
...
             Word.Document wordDoc = new Word.Document();
             Object missing = Type.Missing;
 
             wordDoc = Word.Documents.Open(Path.GetFullPath(filePath), ref missing, ref missing, ref missing, ref missing,
                 ref missing, ref missing, ref missing, ref missing, ref missing, true, ref missing, ref missing,
                 ref missing, ref missing);
 
             MacroParams mp = new MacroParams(Word, new Object[] { "ИмяМакроса" });
                        System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(RunMacro));
                        thread.Start(mp);
                        waitHandle.WaitOne();
 
        }
 
        static void ClickMacroButton()
        {
            int msCount = 0;
            while (msCount < 5)
            {
                //ищем окно по имени
                IntPtr mkrsWnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, null, "Преобразовать файл в формат T3000");
                //ищем в окне calcWnd кнопку класса Button с подписью 1
                IntPtr button1 = FindWindowEx(mkrsWnd, IntPtr.Zero, "Button", "Нет");
 
                if (button1 != IntPtr.Zero)
                {
                    // посылаем нажатие кнопки мыши, последний параметр
                    // содержит координаты мыши (скопировано из Spy++)
                    SendMessage(button1, WM_LBUTTONDOWN, 1, 0x150018);
                    SendMessage(button1, WM_LBUTTONUP, 0, 0x150018);
                }
                msCount++;
            }
            waitHandle.Set();
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2015, 13:37
Ответы с готовыми решениями:

Как нажать на кнопку в другом приложении?
Как нажать на кнопку в другом приложении? Захватываю я его так: static...

Не получается нажать кнопку в другом приложении
Делаю приложение-кликер, которое будет закрывать окна с ошибкой в приложении, установленном на ПК....

Как нажать программно кнопку в другом приложении
День добрый! Возник вопрос программно нажать в другом приложении кнопку; примеры видел, не все...

Нажать кнопку в другом приложении с использованием Win32 API
public partial class Form1 : Form { public static extern IntPtr...

2
[Bicycle Reinventor]
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
28.01.2015, 16:02 2
Попробуйте создать отдельный поток-наблюдатель, который посредством FindWindowEx периодически проверяет, открылось ли нужное нам диалоговое окно. Если да - запускайте ClickMacroButton(). Хотя какую роль играет waitHandle в полной мере не ясно.
1
0 / 0 / 0
Регистрация: 28.01.2015
Сообщений: 7
29.01.2015, 10:52  [ТС] 3
Спасибо, помогло!

Отслеживать появление окна необходимо было не в основном потоке (как это происходило у меня), а в еще одном, третьем, помимо главного и потока с запуском макроса.

Почему так происходит? Почему созданный поток (запуск word и макроса) нельзя выполнять отдельно от главного (самой программы)?
0
29.01.2015, 10:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.01.2015, 10:52
Помогаю со студенческими работами здесь

WinAPI: Как нажать кнопку в другом приложении, если в нем открыто модальное окно
В общем есть пару вопросов; 1) Как по заголоку окна узнать имя класса 2) int hwnd...

Как нажать кнопку в другом приложение?
Есть приложения MagicWiFi его я нахожу через FindWindow IntPtr handle =...

Нажать на кнопку в стороннем приложении, используя WinAPI
Здравствуйте в кратце Нужно на c# и winapi реализовать данное сообщение &quot;WM_PARENTNOTIFY...

Программно нажать на кнопку в своем приложении - PerformClick не работает
мне надо программно нажать на кнопку в своем приложении, PerformClick упорно отказывается работать...

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

Нажать кнопку в чужом приложении
Помогите нажать кнопку на &quot;левом&quot; приложение !!!!!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru