С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
Woolfer
0 / 0 / 0
Регистрация: 07.09.2013
Сообщений: 10
1

Отправка текста для неактивного окна блокнота

07.09.2013, 04:26. Просмотров 2485. Ответов 21
Метки нет (Все метки)

Доброй ночи, уважаемые обитатели форума. Пишу не большую программку, которая при нажатии определенных клавиш должна выполнять некоторые функции:
-Открывать блокнот.
-Выводить в неактивное окно блокнота зацикленную фразу.
-Останавливать цикл.
-Закрывать блокнот и окно программы.
Программа на банальных 4 клавиши. Пока что управился с первой и последней задачей. И более или мене на уровне "не первый раз вижу" разобрался с hendle-ми (намешал горох с капустой но работает). Но вот с отправкой в блокнот фразы - не пойму что делать. Не могли бы Вы мне помочь с этим? Ну и заодно ткнуть носом в места не хорошего кода (хотелось бы учиться кодить правильно).

Кликните здесь для просмотра всего текста
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
namespace Work_with_notepad
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        const int WM_KEYDOWN = 0x100;
        const int WM_SETTEXT = 0xC;
 
        [DllImport("user32.dll")]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 
        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
 
        [DllImport("user32.dll")]
        static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, UIntPtr
        wParam, IntPtr lParam);
 
        [DllImport("User32.Dll", EntryPoint = "PostMessageA")]
        static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam);
 
        [DllImport("user32.dll")]
        static extern byte VkKeyScan(char ch);
 
        private static void VirtualKeyDown(char key)
        {
            IntPtr handle = FindWindow("Notepad", null);
 
            IntPtr editHandle = FindWindowEx(handle, IntPtr.Zero, "Edit", null);
 
 
            if (editHandle != IntPtr.Zero)
            {
                PostMessage(editHandle, WM_SETTEXT, VkKeyScan(key), 0);
 
            }
 
        }
 
 
        private void button4_Click(object sender, EventArgs e)
        {
            Process note = new Process();
 
            note.StartInfo.FileName="notepad";
            note.Start();
            button4.Enabled = false;
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            string target_name = "notepad";
            Process[] local_procs = Process.GetProcesses();
            try
            {
                Process target_proc = local_procs.First(p => p.ProcessName == target_name);
                target_proc.Kill();
            }
            finally
            {
                Application.Exit();
            }
            button3.Enabled = false;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {        
            button1.Enabled = false;
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            button2.Enabled = false;
        }
    }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2013, 04:26
Ответы с готовыми решениями:

Скриншот неактивного окна программы
Здравствуйте! Мучает вопрос который день: как сделать скриншот окна моей...

Сделать скриншот неактивного окна игры
Мне нужна функция DllCall (AutoIt) в C#. Заранее благодарю. Добавлено через...

Отправка текста приложению, зная его хендл
У меня есть хэндл стороннего приложения и мне нужно отправить в него некий...

Отправка текста и имитация кнопки в неактивное окно( по handle )
Всем доброго времени суток, столкнулся с проблемой, мне необходимо отправить...

Получение текста из консольного окна
Здравствуйте. Помогите программно получить весь текст из консоли сервера...

21
kmaffa
304 / 301 / 146
Регистрация: 29.10.2012
Сообщений: 823
07.09.2013, 06:44 2
Вот таким образом можно в открытое окно блокнота записать какую либо фразу:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
        public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
        [DllImport("User32.dll")]
        public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);
        
        static void Main()
        {
            Process[] notepads = Process.GetProcessesByName("notepad");
            if (notepads.Length == 0) return;
            if (notepads[0] != null)
            {
                for (int i = 0; i < 10; i++)
                {
                    IntPtr child = FindWindowEx(notepads[0].MainWindowHandle, new IntPtr(0), "Edit", null);
                    string s = "Text";
                    SendMessage(child, 0x000C, 0, s);
                }
            }
        }
2
Woolfer
0 / 0 / 0
Регистрация: 07.09.2013
Сообщений: 10
07.09.2013, 10:56  [ТС] 3
Возможно ли с помощью этого кода отправлять комбинации клавиш блокноту? что то например {tab} или {alt+f4}?
0
Rust511
63 / 62 / 7
Регистрация: 19.03.2013
Сообщений: 207
07.09.2013, 11:16 4
ну конечно можно. есть же KeyPressEventArgs и KeyEventArgs, у которых есть свойства KeyChar и KeyCode, Modifiers соответственно
1
Konctantin
940 / 744 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
07.09.2013, 12:02 5
C#
1
2
3
4
5
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
 
SendMessage(winHandle, 0x0100, 19, 0); // {pause} down
SendMessage(winHandle, 0x0101, 19, 0); // {pause} up
обратите внимание, вы как бы нажимаете (0x0100) и отпускаете (0x0101) клавишу.
1
Woolfer
0 / 0 / 0
Регистрация: 07.09.2013
Сообщений: 10
07.09.2013, 12:06  [ТС] 6
Цитата Сообщение от Konctantin Посмотреть сообщение
C#
1
2
3
4
5
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
 
SendMessage(winHandle, 0x0100, 19, 0); // {pause} down
SendMessage(winHandle, 0x0101, 19, 0); // {pause} up
обратите внимание, вы как бы нажимаете (0x0100) и отпускаете (0x0101) клавишу.
спасибо. вот со свойствами в скобках - сложнее всего разобраться.
0
Konctantin
940 / 744 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
07.09.2013, 12:20 7
а что там страшного, открываем документацию по функции SendMessage
Смотрим что означают параметры:
Parameters
hWnd [in]
Type: HWND
A handle to the window whose window procedure will receive the message. If this parameter is HWND_BROADCAST ((HWND)0xffff), the message is sent to all top-level windows in the system, including disabled or invisible unowned windows, overlapped windows, and pop-up windows; but the message is not sent to child windows.
Message sending is subject to UIPI. The thread of a process can send messages only to message queues of threads in processes of lesser or equal integrity level.
Msg [in]
Type: UINT
The message to be sent.
For lists of the system-provided messages, see System-Defined Messages.
wParam [in]
Type: WPARAM
Additional message-specific information.
lParam [in]
Type: LPARAM
Additional message-specific information.
смотрим, что параметр msg - это тип сообщения, в вашем случае это
а wParam b lParam - это параметры этого сообщения (в данном случае wParam - код клавиши).
1
Woolfer
0 / 0 / 0
Регистрация: 07.09.2013
Сообщений: 10
07.09.2013, 12:20  [ТС] 8
Может кто -то подскажет что означают свойства в методе SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);?

поспешил. выше есть ответ..
0
Konctantin
940 / 744 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
07.09.2013, 12:22 9
C#
1
2
#define WM_KEYDOWN 0x100 
#define WM_KEYUP 0x101
читайте выше
1
Woolfer
0 / 0 / 0
Регистрация: 07.09.2013
Сообщений: 10
07.09.2013, 17:54  [ТС] 10
Спасибо, объясняете как на пальцах. Пока вопросов нет, буду разбираться в полученной информации.

Добавлено через 5 часов 11 минут
Уважаемые форумчани. Подскажите, в чем разница между PostMessage и SendMessage?

Добавлено через 9 минут
Цитата Сообщение от Konctantin Посмотреть сообщение
C#
1
2
3
4
5
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
 
SendMessage(winHandle, 0x0100, 19, 0); // {pause} down
SendMessage(winHandle, 0x0101, 19, 0); // {pause} up
обратите внимание, вы как бы нажимаете (0x0100) и отпускаете (0x0101) клавишу.
И еще вопрос, а вот числа 19, 0 в свойствах SendMessage - откуда Вы их взяли?
0
Psilon
Master of Orion
Эксперт .NET
6013 / 4866 / 902
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
07.09.2013, 18:30 11
Woolfer, первый ответ в гугле:
SendMessage и PostMessage. Разница между ними в том, что SendMessage отправляет сообщение и ждет, пока целевое окно это сообщение обработает, а PostMessage просто помещает сообщение в очередь и программа работает дальше. В случае, когда в сообщении задействованы указатели на динамически размещаемые данные, предпочтительно использовать SendMessage, т.к. в противном случае возможна такая ситуация, что когда целевое окно начнет обрабатывать сообщение, указатели уже окажутся освобождены. В обеих функциях требуется дескриптор целевого окна. Узнать его можно перебрав все открытые окна функцией EnumWindows
для простых вопросов пользуйтесь поиском, а то надоедает одно и то же повторять по 100 раз
0
Konctantin
940 / 744 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
07.09.2013, 18:43 12
И еще вопрос, а вот числа 19, 0 в свойствах SendMessage - откуда Вы их взяли?
ответ на это есть в моем посте, почитайте внимательно.
0
Woolfer
0 / 0 / 0
Регистрация: 07.09.2013
Сообщений: 10
07.09.2013, 20:32  [ТС] 13
Цитата Сообщение от kmaffa Посмотреть сообщение
Вот таким образом можно в открытое окно блокнота записать какую либо фразу:
насколько я понимаю в коде должен происходить цикл. но при нажатии на клавишу происходит всего один раз ввод "text".

Добавлено через 1 минуту
я понимаю. первым делом и пользуюсь поиском НО... то что в поиске не всегда написано понятным языком для человека делающего первые шаги в программировании...
0
Psilon
Master of Orion
Эксперт .NET
6013 / 4866 / 902
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
07.09.2013, 20:35 14
Woolfer, в программировании всего 3 типа конструкций:
  • Следование операторов, то есть int x = 5, Console.WriteLine() и тд. Используется, если что-то нужно сделать/произвести
  • Условные операторы Используются, если нужно в зависимости от условий выбирать разную линию поведения
  • Цикл Используются, если нужно повторить какое-то действие N раз
на самом деле даже циклы избыточны, можно просто вместо цикла N раз написать одно и тоже, используя 1) и 2), но это довольно непрактично.

Это утверждение носит название структурной теоремы Бома-Якопини.

Так что выбирайте из этого то, что вам нужно и используйте соответствующую конструкцию в нужном месте.
0
Woolfer
0 / 0 / 0
Регистрация: 07.09.2013
Сообщений: 10
09.09.2013, 09:39  [ТС] 15
Уважаемые форумчане.
Продолжаю разбираться в коде.

Скажите пожалуйста строчка ниже относиться к String.Length или к Array.Length?
C#
1
notepads.Length
Что делает данная строка ? Под каким углом не смотрел все понять не могу..
C#
1
if (notepads[0] != null)
И делает ли что-то в коде поста №2 данный цикл ? Вопрос задаю т.к. по моим наблюдениям - ничего..
C#
1
for (int i = 0; i < 10; i++)
Попрошу опытных форумчан не ругаться т.к. я учусь, так как и вы когда то учились.

Добавлено через 4 часа 22 минуты
Еще мне не получается зациклить код отправки сообщения. (с помощью SendMessage)
а с помощью PostMessage даже не получается отправить строку в блокнот.

Может кто-то подскажет толковым объяснением или кодом.. дабы разобраться?
0
tezaurismosis
Администратор
Эксперт .NET
8612 / 3898 / 730
Регистрация: 17.04.2012
Сообщений: 8,678
Записей в блоге: 14
09.09.2013, 12:54 16
Цитата Сообщение от Woolfer Посмотреть сообщение
Скажите пожалуйста строчка ниже относитЬся к String.Length или к Array.Length?
C#
1
Process[] notepads = Process.GetProcessesByName("notepad");
notepads - это массив, а значит относится к Array.Length.
Об этом можно узнать без лишних размышлений, просто наведя курсор мыши на имя переменной, и Visual Studio вам подскажет тип её.

Цитата Сообщение от Woolfer Посмотреть сообщение
C#
1
if (notepads[0] != null)
Проверяет, запущен ли Блокнот

Не по теме:

Psilon, вашим сообщением можно ответить на практически любое сообщение в этом разделе. А структурная теорема Бома-Якопини будет вводить в ужас всех это прочитавших. :)



Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от Woolfer Посмотреть сообщение
для человека делающего первые шаги в программировании
Я на первых шагах в программировании консольные приложения писал, да простейшие формы строил, а не плясал под грохот бубна со сложным WinAPI

0
Woolfer
0 / 0 / 0
Регистрация: 07.09.2013
Сообщений: 10
09.09.2013, 19:15  [ТС] 17
Цитата Сообщение от tezaurismosis Посмотреть сообщение
Я на первых шагах в программировании консольные приложения писал, да простейшие формы строил, а не плясал под грохот бубна со сложным WinAPI
консольные приложения, писались на первом курсе института.. они мне не вызывают никакой интерес.
В любом случае спасибо за ответы.
0
Konctantin
940 / 744 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
10.09.2013, 14:45 18
консольные приложения, писались на первом курсе института.. они мне не вызывают никакой интерес.
как-то не вяжется с:
Скажите пожалуйста строчка ниже относиться к String.Length или к Array.Length?
вам бы позаниматься с простенькими задачами, а не залезать сразу в дебри.
0
Woolfer
0 / 0 / 0
Регистрация: 07.09.2013
Сообщений: 10
10.09.2013, 16:09  [ТС] 19
Цитата Сообщение от Konctantin Посмотреть сообщение
как-то не вяжется с:

вам бы позаниматься с простенькими задачами, а не залезать сразу в дебри.
Ничего проще чем это - я придумать не смог..
0
Qwertiy
821 / 629 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
11.09.2013, 14:01 20
Цитата Сообщение от tezaurismosis Посмотреть сообщение
if (notepads[0] != null)
Проверяет, запущен ли Блокнот
С чего бы это?
0
11.09.2013, 14:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2013, 14:01

Подключение к MySQL и отправка запроса на основе текста из textbox-ов
Здравствуйте дорогие форумчане! Вот решил сделать коннект к базе при этом...

Как для неактивного окна применить клавиатуру активного
Надо понять, как для неактивного окна применить клавиатуру активного. Сам...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru