ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
|
C#+WinAPI отправка сообщений в окно |

15.04.2010, 10:33
|
|
Познающий
Регистрация: 14.10.2007
Сообщений: 47
Провел на форуме: 91186
Репутация:
18
|
|
C#+WinAPI отправка сообщений в окно
У меня возникла проблема.
Не получается отправить в окно сообщение о нажатой кнопке F1
Капаюсь уже в таблицах ассема, в лекциях с инста, но разве в них что-то найдешь после 2-х лет перекладывания с места на место.
/
Код:
//**********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;
//*********/WinAPI константы*********
...
...
...
private void SentMes_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;
}
retValue = SendMessage(hWnd, WM_SETFOCUS, nul, nul);
retValue = SendMessage(hWnd, WM_KEYDOWN, t1, nul);
retValue = SendMessage(hWnd, WM_KEYUP, t1, nul);
}
Где-то тут зарылся косяк.
В тестируется все в блокноте. Сообщения о нажатых символах идут. Но если отправить код 112, то напишется буква. Помню, что у системных клавишь 2 кода, но вот хоть убейте, не могу вспомнить второй и как его отправить.
Может кто чем поможет?
|
|
|

15.04.2010, 22:34
|
|
Участник форума
Регистрация: 23.07.2008
Сообщений: 202
Провел на форуме: 3075657
Репутация:
122
|
|
какая буква пишется?)
|
|
|

15.04.2010, 23:57
|
|
Познающий
Регистрация: 28.01.2009
Сообщений: 90
Провел на форуме: 432613
Репутация:
80
|
|
На Delphi
procedure SendShift(H: HWnd; Down: Boolean);
var vKey, ScanCode, wParam: Word;
lParam: longint;
begin
vKey:= $10;
ScanCode:= MapVirtualKey(vKey, 0);
wParam:= vKey or ScanCode shl 8;
lParam:= longint(ScanCode) shl 16 or 1;
if not(Down) then lParam:= lParam or $C0000000;
SendMessage(H, WM_KEYDOWN, vKey, lParam);
end;
procedure SendCtrl(H: HWnd; Down: Boolean);
var vKey, ScanCode, wParam: Word;
lParam: longint;
begin
vKey:= $11;
ScanCode:= MapVirtualKey(vKey, 0);
wParam:= vKey or ScanCode shl 8;
lParam:= longint(ScanCode) shl 16 or 1;
if not(Down) then lParam:= lParam or $C0000000;
SendMessage(H, WM_KEYDOWN, vKey, lParam);
end;
procedure SendKey(H: Hwnd; Key: char);
var vKey, ScanCode, wParam: Word;
lParam, ConvKey: longint;
Shift, Ctrl: boolean;
begin
ConvKey:= OemKeyScan(ord(Key));
Shift:= (ConvKey and $00020000) <> 0;
Ctrl:= (ConvKey and $00040000) <> 0;
ScanCode:= ConvKey and $000000FF or $FF00;
vKey:= ord(Key);
wParam:= vKey;
lParam:= longint(ScanCode) shl 16 or 1;
if Shift then SendShift(H, true);
if Ctrl then SendCtrl(H, true);
SendMessage(H, WM_KEYDOWN, vKey, lParam);
SendMessage(H, WM_CHAR, vKey, lParam);
lParam:= lParam or $C0000000;
sleep(50);
SendMessage(H, WM_KEYUP, vKey, lParam);
if Shift then SendShift(H, false);
if Ctrl then SendCtrl(H, false);
end;
SendKey(FindWindow(),'F');
|
|
|

16.04.2010, 00:19
|
|
Постоянный
Регистрация: 09.06.2005
Сообщений: 531
Провел на форуме: 3516666
Репутация:
439
|
|
Key.F1 слать пробовал?
|
|
|

16.04.2010, 10:01
|
|
Познающий
Регистрация: 14.10.2007
Сообщений: 47
Провел на форуме: 91186
Репутация:
18
|
|
Мне же не только F1 отправить нужно. Но и F2, F3, F4 и т.д.
Вообще системные клавиши.
|
|
|

16.04.2010, 10:29
|
|
Познающий
Регистрация: 28.01.2009
Сообщений: 90
Провел на форуме: 432613
Репутация:
80
|
|
коды виртуальных клавиш
F1 - F12 (112 - 123), соотвественно
Пример отправки F1
SendKey(FindWindow(),chr(112));
|
|
|

16.04.2010, 14:17
|
|
Познающий
Регистрация: 14.10.2007
Сообщений: 47
Провел на форуме: 91186
Репутация:
18
|
|
Сообщение от flacs
коды виртуальных клавиш
F1 - F12 (112 - 123), соотвественно
Пример отправки F1
Вероятно вы просто не заметили. Одно из этих числ было указано в первом топике (112). Если послать сообщение с кодом 112 то окно поймет, что вы ему шлете код символа, который похож на "р", а не как не F1.
Попробуйте в блокном отправить код 116 (вроде как F5 должно быть). Если в блокноте появится дата и время, то это действительно F5. Но скорее всего будет символ.
У системных клавишь 2 кода. Один совпадает с символом, другой говорит ОС, что была нажата системная клавишь.
|
|
|

16.04.2010, 14:51
|
|
Участник форума
Регистрация: 19.05.2007
Сообщений: 281
Провел на форуме: 2823587
Репутация:
106
|
|
Вообщем проблема может быть еще в том что ты не в то окно шлеш. Попробуй дочернии поперебирать.
|
|
|

16.04.2010, 15:07
|
|
Познающий
Регистрация: 14.10.2007
Сообщений: 47
Провел на форуме: 91186
Репутация:
18
|
|
Окно то. Сообщение о закрытии окна получает то окно, которое я хочу закрыть.
Что качается блокнота. Если я хочу написать символ, то он его пишет. Коды верно воспринимает, а вот системные кнопки нет
|
|
|

16.04.2010, 15:55
|
|
Участник форума
Регистрация: 19.05.2007
Сообщений: 281
Провел на форуме: 2823587
Репутация:
106
|
|
http://www.edgeofnowhere.cc/viewtopic.php?t=396398
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|