Вверх ↑
Этот топик читают: Гость
Ответов: 1043
Рейтинг: 33
#1: 2014-11-08 17:46:06 ЛС | профиль | цитата
не жмется и хоть убей
Пример nesdebager.rar
карма: 0

0
Ответов: 1343
Рейтинг: 31
#2: 2014-11-08 20:04:34 ЛС | профиль | цитата
эм, а почему нажатие на клавишу стоит через кнопку?, этот компонент не будет делать эмуль в НЕАКТИВНОЕ ОКНО (только SendMessage из доступного, будет работать с неактивным окном)

попробуй сделать сначала активацию окна, а потом эмуль с Handle
карма: 2

0
Ответов: 1043
Рейтинг: 33
#3: 2014-11-08 21:05:58 ЛС | профиль | цитата
Rysik, Этот компонент сначала активирует окно, затем эмулирует, а после активирует предшествующее окно обратно.
Из за не такой уж быстрой отрисовки в масштабах программирования в том числе с многократным обращением к тем или иным окнам, это можно заметить если вызывать метод через малые интервалы... Вы заметите некое периодическое мерцание окон.
карма: 0

0
Ответов: 1343
Рейтинг: 31
#4: 2014-11-08 21:12:14 ЛС | профиль | цитата
вот такую связку попробуй, только вот там как то надо поправить Runtime_Error, но эмуляция работает, в блокнотике проверил


simdll
dll'ку кидай в системные папки там windows и System32\64
карма: 2

1
Голосовали:ashkalov
Ответов: 1043
Рейтинг: 33
#5: 2014-11-09 16:53:28 ЛС | профиль | цитата
Rysik, есть работающий компонент, по которому собственно и сабж
Вот вам кусок из кода компонента.. комментарии добавил

#pas
begin
old := GetForegroundWindow; // Сохраняем дескриптор приоритетного окна в переменную 'old'
SetForegroundWindow(ReadInteger(_Data,_data_Handle,0)); // Устанавливаем в качестве приоритетного окна, окно указаного идентификатора

// ************** Код *****************

SetForegroundWindow(old); // Активируем предшествующее окно передав заранее сохраненный дескриптор
end;


------------ Дoбавленo в 17.50:
Вот переделал чуть, теперь нет Runtime_Eror

#pas
Add(MainForm,2953706,154,280)
{
}
Add(InlineCode,3185247,273,280)
{
WorkPoints=#59:doSimKey=Эмулирует нажатие и последующее отпускание клавиши|
EventPoints=#59:onEnd=Событи происходит кажды раз после завершения операции|
DataPoints=#49:Handle=Идентификатор окна для проведения операции|32:Code=Код клавиши клавиатуры/мыши|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|33:uses kol,Share,Windows,Debug; |0:|4:type|29: THiAsmClass = class(TDebug) |0:|10: private|20: oldwind: HWND; |4: |9: public|20: Handle:THI_Event;|18: Code:THI_Event;|19: onEnd:THI_Event;|0:|51: procedure doSimKey(var _Data:TData; Index:word);|4: |5: end;|1: |86: function _SK(number: real): real; stdcall; external 'simdll.dll' name 'sim_key'; |87:// function _MC(number: real): real; stdcall; external 'simdll.dll' name 'mouse_click';|86:// function _MD(number: real): real; stdcall; external 'simdll.dll' name 'mouse_down';|84:// function _MU(number: real): real; stdcall; external 'simdll.dll' name 'mouse_up';|88:// function _MS(number: real): real; stdcall; external 'simdll.dll' name 'mouse_scroll';|0:|14:implementation|0:|0:|31:procedure THiAsmClass.doSimKey;|0:|3:var|0:|46: Data_emity:TData; // ***************** !!!|16: KeyCode:real;|14: RCode:real;|4: |5:begin|0:|41: RCode:=ReadInteger(_Data,Code,1); |33: oldwind:= GetForegroundWindow;|52: SetForegroundWindow(ReadInteger(_Data,Handle,0));|23: KeyCode:=_SK(RCode);|13: Sleep(20);|38: SetForegroundWindow(oldwind); |62: _hi_onEvent(onEnd{, KeyCode}); // ***************** !!!|3: |4:end;|0:|4:end.|
link(Handle,16584642:Value,[])
link(Code,6629165:Value,[])
}
Add(Button,2522778,210,280)
{
Left=145
Top=65
link(onClick,3185247:doSimKey,[])
}
Add(Memory,16584642,273,231)
{
Default=Integer(66396)
}
Add(Memory,6629165,280,182)
{
Default=Integer(32)
}


Но по коду есть вопросы...
Первый вопрос о переменной
#pas
Data_emity:TData
_ Я ее добавил в процедуру doSimKey, без нее Runtime_Error... Почему?

Второй вопрос. В этой же процедуре в событии onEnd я закомментировал вывод переменной KeyCode
С ней программа просто вылетает, хоть и судя по исходнику предоставленному Rysik-ом Функция возвращает значение. Почему происходит краш?

Есть подозрение на типы данных
карма: 0

0
файлы: 1code_34578.txt [643B] [195]
Ответов: 1343
Рейтинг: 31
#6: 2014-11-09 22:16:36 ЛС | профиль | цитата
ashkalov писал(а):
Вот переделал чуть, теперь нет Runtime_Eror



ну так эмуль то проходит нормально, всё работает или по прежнему не реагирует?
------------ Дoбавленo в 23.16:
ashkalov писал(а):
Есть подозрение на типы данных


грубо извиняюсь, причём за автора, который писал мануал по использованию в котором написано что выходной параметр типа REAL , а на деле оказалось что надо INTEGER, и вызывать не через stdcall , а через cdecl , что так же написано в мануале вызывать через stdcall , а надо cdecl
карма: 2

1
Голосовали:ashkalov
Ответов: 1043
Рейтинг: 33
#7: 2014-11-09 22:31:30 ЛС | профиль | цитата
Спасибо разобрался
карма: 0

0
7
Сообщение
...
Прикрепленные файлы
(файлы не залиты)