//**********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);
}
Отправка сообщений в неактивное окно
Тестирую на блокноте. Если в блокноте нажать на F5 то в нем будет время и дата.
Но при отправке якобы нажатой системной кнопки в блокноте пишется символ. На сколько я помню, у системных кнопок 2 кода. Но я не помню какие и как их отправлять.
Вот код отправки сообщения. Пишу я на C#.
Код:
Если раскоментить WM_CHAR и отпавить код символа, то он появится в блокноте.
SendKeys.Send("{F1}"); как-то тоже не пошло.
Выходит что я обязан дождаться ответа, а он может идти долго. Мне нужно отправлять нажатие кнопки каждую секунду.
Если есть знающие люди подкиньте идею.
Код:
[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);
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. И вообще по возможности следует использовать имеющийся функционал языка.
PostMessage сделал все что мне нужно.
Он не ждет ответа от окна. Мне про неё говорили, но из головы вылетела.
А на счет MessageBox так это я просто вспоминал WinAPI. Проходил на 4 курсе института.
Спасибо большое.