Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Отправка сообщений в неактивное окно

27K
17 мая 2010 года
snubrik
10 / / 22.07.2007
Суть проблемы в том, что не могу отправить сообщение о том, что я нажал кнопку F1, F2, F3, F4, F5, ...
Тестирую на блокноте. Если в блокноте нажать на F5 то в нем будет время и дата.
Но при отправке якобы нажатой системной кнопки в блокноте пишется символ. На сколько я помню, у системных кнопок 2 кода. Но я не помню какие и как их отправлять.

Вот код отправки сообщения. Пишу я на C#.

Код:
//**********WinAPI функции*********
 
        [DllImport("user32.dll", EntryPoint = "FindWindow")]
        private static extern IntPtr FindWindow(string _ClassName, string _WindowName);
 
        [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
        private static extern IntPtr FindWindowEx(IntPtr hwndPrnt, IntPtr hwndChildAfter, string _ClassName, string _WindowName);
 
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
 
        [DllImport("user32.dll", CharSet = CharSet.Unicode)]
        public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
 
        [DllImport("user32.dll", CharSet = CharSet.Unicode)]
        public static extern int DestroyWindow(IntPtr hWnd);
 
       
 
//*********/WinAPI функции*********
 
 
//**********WinAPI константы*********
        const int BM_SETSTATE = 243;
        const int WM_LBUTTONDOWN = 513;
        const int WM_LBUTTONUP = 514;
        const int WM_KEYDOWN = 256;
        const int WM_CHAR = 258;
        const int WM_KEYUP = 257;
        const int WM_SETFOCUS = 7;
        const int WM_SYSCOMMAND = 274;
        const int SC_MINIMIZE = 32;
        const int WM_CLOSE = 0x0010;
        const int VK_F1 = 0x70;   //F1 key
        const int VK_F2 = 0x71;   //F2 key
        const int VK_F3 = 0x72;   //F3 key
        const int VK_F4 = 0x73;   //F4 key
        const int VK_F5 = 0x74;   //F5 key
        const int VK_F6 = 0x75;   //F6 key
        const int VK_F7 = 0x76;   //F7 key
        const int VK_F8 = 0x77;   //F8 key
        const int VK_F9 = 0x78;   //F9 key
        const int VK_F10 = 0x79;   //F10 key
        const int VK_F11 = 0x7A;   //F11 key
        const int VK_F12 = 0x7B;   //F12 key
        const int VK_0 = 0x30;   //0 key
        const int VK_1 = 0x31;   //1 key
        const int VK_2 = 0x32;   //2 key
        const int VK_3 = 0x33;   //3 key
        const int VK_4 = 0x34;   //4 key
        const int VK_5 = 0x35;   //5 key
        const int VK_6 = 0x36;    //6 key
        const int VK_7 = 0x37;    //7 key
        const int VK_8 = 0x38;   //8 key
        const int VK_9 = 0x39;    //9 key
 
 
//*********/WinAPI константы*********
 
 
 
private void button1_Click(object sender, EventArgs e)
{
        IntPtr hWnd = FindWindow(null, comboBox1.SelectedItem.ToString());
        IntPtr t1;
        if (hWnd == IntPtr.Zero)
        {
                MessageBox(new IntPtr(0), "Not found main", "Error", 0);
                return;
        }
        IntPtr hEdit = FindWindowEx(hWnd, IntPtr.Zero, "Button", "5");
        if (hEdit == IntPtr.Zero)
        {
                MessageBox(new IntPtr(0), "Not found child", "Error", 0);
                return;
        }
   
                t1 = (IntPtr)116;
         // Scan-код символа "9" (F1 = 112, F2 = 113, F3 = 114 ... F10 = 121)
        IntPtr nul = IntPtr.Zero;
        int retValue;
 
        retValue = SendMessage(hEdit, WM_SETFOCUS, nul, nul);
        retValue = SendMessage(hEdit, WM_KEYDOWN, t1, nul);
        //retValue = SendMessage(hEdit, WM_CHAR, t1, nul);
        retValue = SendMessage(hEdit, WM_KEYUP, t1, nul);
}


Если раскоментить WM_CHAR и отпавить код символа, то он появится в блокноте.
SendKeys.Send("{F1}"); как-то тоже не пошло.
Выходит что я обязан дождаться ответа, а он может идти долго. Мне нужно отправлять нажатие кнопки каждую секунду.

Если есть знающие люди подкиньте идею.
297
17 мая 2010 года
koodeer
1.2K / / 02.05.2009
Вот так у меня посылается в Блокнот код F5.
Код:
[DllImport("user32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(string _ClassName, string _WindowName);

[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
private static extern IntPtr FindWindowEx(IntPtr hwndPrnt, IntPtr hwndChildAfter, string _ClassName, string _WindowName);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int PostMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);

const int WM_KEYDOWN = 256;
const int WM_KEYUP = 257;


IntPtr hWnd = FindWindow(null, "Untitled - Notepad");
if (hWnd == IntPtr.Zero)
{
    MessageBox.Show("Not found main", "Error");
    return;
}
IntPtr hEdit = FindWindowEx(hWnd, IntPtr.Zero, "Edit", "");
if (hEdit == IntPtr.Zero)
{
    MessageBox.Show("Not found child", "Error");
    return;
}
IntPtr t1 = (IntPtr)Keys.F5;
IntPtr nul = IntPtr.Zero;
PostMessage(hEdit, WM_KEYUP, t1, nul);
PostMessage(hEdit, WM_KEYDOWN, t1, nul);

Имхо, незачем использовать апишную функцию MessageBox, если есть кошерный управляемый метод MessageBox.Show. И вообще по возможности следует использовать имеющийся функционал языка.
27K
17 мая 2010 года
snubrik
10 / / 22.07.2007
Это то что нужно.
PostMessage сделал все что мне нужно.
Он не ждет ответа от окна. Мне про неё говорили, но из головы вылетела.
А на счет MessageBox так это я просто вспоминал WinAPI. Проходил на 4 курсе института.

Спасибо большое.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог