Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi и WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 71, средняя оценка - 4.63
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
#1

Работа с WinAPI (PostMessage) - Delphi WinAPI

28.09.2011, 22:16. Просмотров 9405. Ответов 18
Метки нет (Все метки)

проблема с окном нарисованным в дериктХ,надло послать строку чату,например, фокус получают чат если нажать ентер(те сначала окну надо послать ентер). посылаю на хендл окна через пост,но ничего не происходит
п.с.игра perfect world
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2011, 22:16
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Работа с WinAPI (PostMessage) (Delphi WinAPI):

Postmessage WinApi
Добрый день форумчане. Вообщем задача такая: Через программу написаную на...

Работа с FindWindow и PostMessage: как надежно передавать данные между программами?
Добрый день! Осваиваю передачу сообщений между приложениями с использованием...

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

Работа с COM портами WinAPI, конкретно функция ClearCommError
Всем доброго времени суток, я вообще не программист, программирую от случая к...

PostMessage
Доброго дня. Слал через PostMessage кнопки и беды не знал. PostMessage(h,...

Передать текст из 1-го приложения во 2-е через PostMessage
Всем доброго времени суток! Есть небольшая проблемка с postmessge. Задача...

18
deathNC
1891 / 1004 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
28.09.2011, 22:48 #2
Прочитай этот пост.

Там byte('F') замени на vk_Return

Добавлено через 1 минуту
Ну и естественно Handle свой подставь
1
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
29.09.2011, 15:20  [ТС] #3
function EnumProc (Wd: HWnd; Param: LongInt): Boolean; stdcall;
begin
PostMessage(Wd, WM_KeyDown, byte('F'), 1);
Result := true;
end;
а чего не поднимаешь клавишу?
// перебираем все дочерние формы
EnumChildWindows(hWindow, @EnumProc, 0);
end;
в окнах нарисованных на дериктХ нет дочерних окон..

пробовал так
Delphi
1
2
3
PostMessage(findwindow(nil,'Perfect World'), WM_KeyDown, byte(vk_Return), 1);
sleep(200);
PostMessage(findwindow(nil,'Perfect World'), WM_Keyup, byte(vk_Return), 1);
ноль реакции
пробовал без слипа и без поднятия клавищи,рещультат такой же
0
MultiVan
59 / 59 / 4
Регистрация: 13.08.2011
Сообщений: 165
29.09.2011, 15:30 #4
Цитата Сообщение от spydark91 Посмотреть сообщение
пробовал так
Delphi
1
2
3
PostMessage(findwindow(nil,'Perfect World'), WM_KeyDown, byte(vk_Return), 1);
sleep(200);
PostMessage(findwindow(nil,'Perfect World'), WM_Keyup, byte(vk_Return), 1);
ноль реакции
пробовал без слипа и без поднятия клавищи,рещультат такой же
1.Он нашел окна с заголовком 'Perfect World' ?
2.Откуда знаеш что именно 'Perfect World реагирует на кнопку Enter(может быть там реагирует на Enter дочерная окна) ?
0
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
29.09.2011, 15:39  [ТС] #5
Он нашел окна с заголовком 'Perfect World' ?
нашел,проверял
2.Откуда знаеш что именно 'Perfect World реагирует на кнопку Enter(может быть там реагирует на Enter дочерная окна) ?
откуда в окне нарисованным в дериктХ нету дочерних онон. проверял с помощбю spy++
0
MultiVan
59 / 59 / 4
Регистрация: 13.08.2011
Сообщений: 165
29.09.2011, 15:43 #6
Фокус на окне установил? если нет то держи:
Delphi
1
PostMessage(HANDLE,WM_SETFOCUS,0,0);
1
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
29.09.2011, 15:48  [ТС] #7
Delphi
1
2
3
4
5
6
7
8
h:hwnd;
begin
h:=findwindow(nil,'Perfect World');
PostMessage(h,WM_SETFOCUS,0,0);
sleep(200);
PostMessage(h, WM_KeyDown, byte(vk_Return), 1);
sleep(200);
PostMessage(h, WM_Keyup, byte(vk_Return), 1);
не работает
0
MultiVan
59 / 59 / 4
Регистрация: 13.08.2011
Сообщений: 165
29.09.2011, 15:59 #8
попробуй так
Delphi
1
2
3
4
5
6
7
8
9
h:hwnd;
begin
h:=findwindow(nil,'Perfect World');
SendMessage(h,WM_SETFOCUS,0,0);
sleep(200);
SendMessage(h, WM_KeyDown, vk_Return, 0);
sleep(200);
SendMessage(h, WM_Keyup, vk_Return, 0);
end;
1
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
29.09.2011, 16:02  [ТС] #9
не помогло
0
MultiVan
59 / 59 / 4
Регистрация: 13.08.2011
Сообщений: 165
29.09.2011, 16:09 #10
Цитата Сообщение от spydark91 Посмотреть сообщение
не помогло
ну не знаю , так программно можно нажать кнопки в Окнах , ну удач!
0
deathNC
1891 / 1004 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
29.09.2011, 16:37 #11
А как ты испытываешь код? Ты в смысле создаёшь какую-то глобальную клавишу, на которую вызываешь код нажатия клавиши Enter? То есть игра во время работы программы активна?
0
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
29.09.2011, 16:43  [ТС] #12
если нажать ентер то в игре откроется менюшка
1-запускаю игру
2-запускаю прогу и нажимаю кнопочку(действие стоит на кнопке)
разворачиваю игру и смотрю на результат,если менбшка есть,значит успех)
0
deathNC
1891 / 1004 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
29.09.2011, 16:48 #13
spydark91, так может игра должна быть АКТИВНОЙ, или нет? Попробуй реализовать такой алгоритм:
1) Пишешь прогу с глобальным сочетанием клавиш
2) Запускаешь прогу
3) Запускаешь игру
4) Жмёшь глобальное сочетание
5) Смотришь на результат

Добавлено через 1 минуту
Тут имеется ввиду, что твоя прога по нажатию глобального сочетания будет посылать твоему игровому окну сообщения PostMessage...
0
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
29.09.2011, 17:07  [ТС] #14
ща попробую

Добавлено через 10 минут
Delphi
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
 
var h:hwnd;
begin
showmessage('sd');
h:=findwindow(nil,'Perfect World');
PostMessage(h,WM_SETFOCUS,0,0);
sleep(200);
PostMessage(h, WM_KeyDown, byte(vk_Return), 1);
sleep(200);
PostMessage(h, WM_Keyup, byte(vk_Return), 1);
 
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterHotKey(handle,81, 0, 81);
end;
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnRegisterHotKey(handle,81);
end;
 
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
if getasynckeystate(81) <> 0 then {q}
  button1.Click;
  
end;
 
end.
вот,но он почему то не реагирует на надатие клавиши во время активной игры,сообщение вылазит если в фокусе любое приложение кроме игры

Добавлено через 4 минуты
так же не реагрует на getasynckeystate(
0
AndyZorg
Заблокирован
29.09.2011, 23:03 #15
Тогда надо пробовать keybdevent. Пробовал?
0
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
30.09.2011, 12:07  [ТС] #16
C++
1
2
3
4
5
6
7
VOID keybd_event
(
BYTE bVk,    // код виртуальной клавиши
BYTE bScan,  // аппаратный скэн-код
DWORD dwFlags,  // флажки, определяющие различные параметры функции
DWORD dwExtraInfo   // дополнительные данные, связанные с нажатием клавиши
);
Параметры
bVk
Определяет код виртуальной клавиши. Код должен быть значением в диапазоне от 1 до 254.
bScan
Определяет для клавиши аппаратный скэн-код.
dwFlags
Набор флаговых битов, которые определяют различные виды операций функции. Прикладная программа может использовать любую комбинацию следующих предопределенных постоянных значений, чтобы установить флажки:

KEYEVENTF_EXTENDEDKEY - Если она установлена, скэн-коду предшествует префиксный байт, имеющий значение 0xE0 (224).
KEYEVENTF_KEYUP - Если установлена, клавиша была отпущена. Если не установлена, клавиша была нажата.
dwExtraInfo
Определяет дополнительное 32-разрядное значение, связанное с нажатием клавиши.

не очень понял что такое скен-код и про флаги,мжоете объяснить
0
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
01.10.2011, 16:39  [ТС] #17
вот,попробовал
неработает
Delphi
1
2
3
setforegroundwindow(findwindow(nil,'Perfect World'));
keybd_event(13, 0,0,0);
keybd_event(13,0,KEYEVENTF_KEYUP,0);
на передний план выводит
0
AndyZorg
Заблокирован
01.10.2011, 17:03 #18
Сам долго курил эту функцию было дело... Без аппаратного сканкода не работает...
надо Вам так написать:

Delphi
1
2
3
SetForegroundWindow(FindWindow(nil, 'Perfect World'));
keybd_event(13, MapVirtualKey(13, 0), 0, 0);
keybd_event(13, MapVirtualKey(13, 0), KEYEVENTF_KEYUP, 0);
И еще, RTFM, читайте MSDN - там же написано, что эта функция устарела, вместо нее надо использовать SendInput. (Windows NT/2000/XP:This function has been superseded. Use SendInput instead.). Но и keybd_event я сейчас потестировал - работает.

Добавлено через 13 секунд
Так что выбор за Вам, что юзать...
0
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
01.10.2011, 17:12  [ТС] #19
если я ставил фокуc в свой едит например то все работало и без скан кода,но в игру не посылает даже с ним

ща буду рабзираться с sendinput
0
01.10.2011, 17:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.10.2011, 17:12
Привет! Вот еще темы с решениями:

PostMessage(Handle, WM_CLOSE, 0, 0);
Может я совсем глупый... Обрабатываю я некоторую информацию в OnShow формы и...

Отправка нажатий клавиш, с помошью PostMessage
Доброе время суток! Мне необходимо послать нажатия клавиш в игру,...

Отправка текста в чужое окно через PostMessage
Ребза привет) ситуация такая отправляю текст в чужое окно через PostMessage...

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


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

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

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