Вверх ↑
Этот топик читают: Гость
Ответов: 94
Рейтинг: 2
#1: 2017-02-16 17:15:19 ЛС | профиль | цитата
Добрый день.
Перед тем как создавать тему:
- провел много тестов;
- поискал на форуме;
- поискал в интернете;
- спросил совета у одного из форумчан.

Не работает сочетание "Alt+".
Пример:

Add(MainForm,3267288,770,322)
{
link(onCreate,13842337:doStartHotKey,[])
}
Add(GHotKey,13842337,819,336)
{
Alt=1
Key=49
link(onEventHotKey,11970995:doKeyStroke,[])
}
Add(InlineCode,11970995,868,336)
{
WorkPoints=#61:doKeyStroke=Симулировать набор на клавиатуре указанной строки
EventPoints=#8:onResult|
DataPoints=#3:Str|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|4:uses|29: KOL, Share, Debug, Windows;|0:|0:|4:type|1: |29: PMouseInput = ^TMouseInput;|31: tagMOUSEINPUT = packed record|16: dx: Longint;|16: dy: Longint;|21: mouseData: DWORD;|19: dwFlags: DWORD;|16: time: DWORD;|23: dwExtraInfo: DWORD;|6: end;|30: TMouseInput = tagMOUSEINPUT;|0:|29: PKeybdInput = ^TKeybdInput;|31: tagKEYBDINPUT = packed record|14: wVk: WORD;|16: wScan: WORD;|19: dwFlags: DWORD;|16: time: DWORD;|23: dwExtraInfo: DWORD;|6: end;|30: TKeybdInput = tagKEYBDINPUT;|0:|35: PHardwareInput = ^THardwareInput;|34: tagHARDWAREINPUT = packed record|16: uMsg: DWORD;|18: wParamL: WORD;|18: wParamH: WORD;|6: end;|36: THardwareInput = tagHARDWAREINPUT;|0:|19: PInput = ^TInput;|26: tagINPUT = packed record|17: Itype: DWORD;|19: case Integer of|27: 0: (mi: TMouseInput);|27: 1: (ki: TKeybdInput);|30: 2: (hi: THardwareInput);|6: end;|20: TInput = tagINPUT;|0:|0:|0:|29: THiAsmClass = class(TDebug)|11: private|0:|10: public|21: Str: THI_Event;|29: onResult: THI_Event; |59: procedure doKeyStroke(var _Data: TData; Index: Word);|6: end;|2: |129: function SendInput(cInputs: UINT; var pInputs: TInput; cbSize: Integer): UINT; stdcall; external 'user32.dll' name 'SendInput';|0:|5:const|18: INPUT_MOUSE = 0;|21: INPUT_KEYBOARD = 1;|21: INPUT_HARDWARE = 2;|2: |32: KEYEVENTF_EXTENDEDKEY = $0001;|26: KEYEVENTF_KEYUP = $0002;|28: KEYEVENTF_UNICODE = $0004;|29: KEYEVENTF_SCANCODE = $0008;|2: |22: MAPVK_VK_TO_VSC = 0;|22: MAPVK_VSC_TO_VK = 1;|23: MAPVK_VK_TO_CHAR = 2;|25: MAPVK_VSC_TO_VK_EX = 3;|2: |2: |14:implementation|0:|0:|0:|42:procedure SimulateKeyPress(Key: WideChar);|3:var|31: Input: array[0..1] of TInput;|5:begin|36: FillChar(Input, SizeOf(Input), 0);|18: with Input[0] do|7: begin|28: Itype := INPUT_KEYBOARD;|14: with ki do|9: begin|25: wScan := Word(Key);|34: dwFlags := KEYEVENTF_UNICODE|8: end;|6: end;|18: with Input[1] do|7: begin|28: Itype := INPUT_KEYBOARD;|14: with ki do|9: begin|25: wScan := Word(Key);|54: dwFlags := KEYEVENTF_UNICODE or KEYEVENTF_KEYUP;|8: end;|6: end;|53: SendInput(Length(Input), Input[0], SizeOf(TInput));|4:end;|0:|0:|66:procedure THiAsmClass.doKeyStroke(var _Data: TData; Index: Word); |3:var|16: S: WideString;|13: I: Integer;|5:begin|34: S := ReadString(_Data, Str, '');|2: |28: for I := 1 to Length(S) do|7: begin|27: SimulateKeyPress(S[I]);|6: end;|39: _hi_CreateEvent(_Data, @onResult, 0);|4:end;|0:|0:|4:end.|
link(Str,13116176:Text,[])
}
Add(Edit,13116176,868,287)
{
Left=10
Top=5
Width=365
Text="абвгде"
}
Откройте блокнот и нажмите Alt+1, а теперь тоже самое но установите Ctrl+1.
карма: 0

0
vip
#1.1контекстная реклама от партнеров
Ответов: 758
Рейтинг: 112
#2: 2017-02-16 17:35:56 ЛС | профиль | цитата
Код клавиши "49" это "1"
Коды клавиш
карма: 1

0
Ответов: 94
Рейтинг: 2
#3: 2017-02-16 18:10:03 ЛС | профиль | цитата
Я в курсе - там так и установлено.
карма: 0

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#4: 2017-02-16 19:21:51 ЛС | профиль | цитата
Если в системе уже кем-то используется данное сочетание, то компонент не может его использовать, тк используется API-функция RegisterHotKey -- https://msdn.microsoft.com/en-us/library/windows/desktop/ms646309(v=vs.85).aspx

Remarks

When a key is pressed, the system looks for a match against all hot keys. Upon finding a match, the system posts the WM_HOTKEY message to the message queue of the window with which the hot key is associated. If the hot key is not associated with a window, then the WM_HOTKEY message is posted to the thread associated with the hot key.
This function cannot associate a hot key with a window created by another thread.
RegisterHotKey fails if the keystrokes specified for the hot key have already been registered by another hot key.
If a hot key already exists with the same hWnd and id parameters, it is maintained along with the new hot key. The application must explicitly call UnregisterHotKey to unregister the old hot key.


Редактировалось 1 раз(а), последний 2017-02-16 19:29:24
карма: 22

0
Ответов: 94
Рейтинг: 2
#5: 2017-02-16 19:50:57 ЛС | профиль | цитата
nesco писал(а):
тк используется API-функция RegisterHotKey

Читал о ней. Я так и подумал, что компонент на ней работает. Тогда вопрос: как обойти это? Программа Auto Hot Key (и ее аналоги) это обходит и сколько я не перечитывал форумов и статей - никто с подобной проблемой не сталкивался.
Да и тут даже вопрос не в этом. Просто откройте блокнот и нажмите Alt: фокус упадет на верхнее меню - в этом вся проблема. Alt в большинстве программ уже выполняет функцию.

Попробуйте так:
Add(MainForm,3267288,742,322)
{
Height=105
link(onCreate,7036869:doEvent1,[])
}
Add(GHotKey,13842337,819,336)
{
Alt=1
Key=49
link(onEventHotKey,13399088:doWork2,[])
}
Add(InlineCode,11970995,875,336)
{
WorkPoints=#61:doKeyStroke=Симулировать набор на клавиатуре указанной строки
EventPoints=#8:onResult|
DataPoints=#3:Str|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|4:uses|29: KOL, Share, Debug, Windows;|0:|0:|4:type|1: |29: PMouseInput = ^TMouseInput;|31: tagMOUSEINPUT = packed record|16: dx: Longint;|16: dy: Longint;|21: mouseData: DWORD;|19: dwFlags: DWORD;|16: time: DWORD;|23: dwExtraInfo: DWORD;|6: end;|30: TMouseInput = tagMOUSEINPUT;|0:|29: PKeybdInput = ^TKeybdInput;|31: tagKEYBDINPUT = packed record|14: wVk: WORD;|16: wScan: WORD;|19: dwFlags: DWORD;|16: time: DWORD;|23: dwExtraInfo: DWORD;|6: end;|30: TKeybdInput = tagKEYBDINPUT;|0:|35: PHardwareInput = ^THardwareInput;|34: tagHARDWAREINPUT = packed record|16: uMsg: DWORD;|18: wParamL: WORD;|18: wParamH: WORD;|6: end;|36: THardwareInput = tagHARDWAREINPUT;|0:|19: PInput = ^TInput;|26: tagINPUT = packed record|17: Itype: DWORD;|19: case Integer of|27: 0: (mi: TMouseInput);|27: 1: (ki: TKeybdInput);|30: 2: (hi: THardwareInput);|6: end;|20: TInput = tagINPUT;|0:|0:|0:|29: THiAsmClass = class(TDebug)|11: private|0:|10: public|21: Str: THI_Event;|29: onResult: THI_Event; |59: procedure doKeyStroke(var _Data: TData; Index: Word);|6: end;|2: |129: function SendInput(cInputs: UINT; var pInputs: TInput; cbSize: Integer): UINT; stdcall; external 'user32.dll' name 'SendInput';|0:|5:const|18: INPUT_MOUSE = 0;|21: INPUT_KEYBOARD = 1;|21: INPUT_HARDWARE = 2;|2: |32: KEYEVENTF_EXTENDEDKEY = $0001;|26: KEYEVENTF_KEYUP = $0002;|28: KEYEVENTF_UNICODE = $0004;|29: KEYEVENTF_SCANCODE = $0008;|2: |22: MAPVK_VK_TO_VSC = 0;|22: MAPVK_VSC_TO_VK = 1;|23: MAPVK_VK_TO_CHAR = 2;|25: MAPVK_VSC_TO_VK_EX = 3;|2: |2: |14:implementation|0:|0:|0:|42:procedure SimulateKeyPress(Key: WideChar);|3:var|31: Input: array[0..1] of TInput;|5:begin|36: FillChar(Input, SizeOf(Input), 0);|18: with Input[0] do|7: begin|28: Itype := INPUT_KEYBOARD;|14: with ki do|9: begin|25: wScan := Word(Key);|34: dwFlags := KEYEVENTF_UNICODE|8: end;|6: end;|18: with Input[1] do|7: begin|28: Itype := INPUT_KEYBOARD;|14: with ki do|9: begin|25: wScan := Word(Key);|54: dwFlags := KEYEVENTF_UNICODE or KEYEVENTF_KEYUP;|8: end;|6: end;|53: SendInput(Length(Input), Input[0], SizeOf(TInput));|4:end;|0:|0:|66:procedure THiAsmClass.doKeyStroke(var _Data: TData; Index: Word); |3:var|16: S: WideString;|13: I: Integer;|5:begin|34: S := ReadString(_Data, Str, '');|2: |28: for I := 1 to Length(S) do|7: begin|27: SimulateKeyPress(S[I]);|6: end;|39: _hi_CreateEvent(_Data, @onResult, 0);|4:end;|0:|0:|4:end.|
link(Str,13116176:Text,[])
}
Add(Edit,13116176,875,287)
{
Left=10
Top=5
Width=365
Text="абвгде"
}
Add(Edit,5979537,931,287)
{
Left=10
Top=35
Width=365
Text=""
}
Add(GHotKey,12791665,819,371)
{
Ctrl=1
Key=49
link(onEventHotKey,13399088:doWork3,[(865,377)])
}
Add(Hub,7036869,791,336)
{
link(onEvent1,13842337:doStartHotKey,[])
link(onEvent2,12791665:doStartHotKey,[(812,349)(812,377)])
}
Add(HubEx,13399088,861,336)
{
link(onEvent,11970995:doKeyStroke,[])
}
Так ведь должно работать?

Редактировалось 2 раз(а), последний 2017-02-16 20:17:49
карма: 0

0
Ответов: 165
Рейтинг: 6
#6: 2017-02-16 20:14:01 ЛС | профиль | цитата
lipKAI, никто не мешает использовать такую схему:

Add(MainForm,2953706,308,175)
{
Color=16777215
Position=1
Point(onKeyDown)
link(onKeyDown,3600384:doCheckMask,[])
}
Add(KeyMask,3600384,378,196)
{
Alt=1
Key=49
link(onTrue,11999924:doMessage,[])
}
Add(Message,11999924,441,203)
{
}

или если нужно глобально, то вот IC с просторов форума (не помню чей), адаптируйте под себя:

Add(InlineCode,2317400,385,343)
{
WorkPoints=#7:SetHook|6:UnHook|
EventPoints=#7:onKeyUp|9:onKeyDown|10:onSysKeyUp|12:onSysKeyDown|8:onRepeat|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|38:uses kol,Share,Debug,Windows,Messages;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|40: procedure onKey(param,code:integer);|9: public|65: onKeyUp,onKeyDown,onSysKeyUp,onSysKeyDown,onRepeat:THI_Event;|4: |46: procedure SetHook(var dt:TData; Idx:WORD);|45: procedure UnHook(var dt:TData; Idx:WORD);|5: end;|0:|14:implementation|0:|5:const|21: WH_KEYBOARD_LL = $D;|22: KBH_KEYREPEAT = $DD;|4:var |12: Hook:HHOOK;|45: ret:procedure(param,code:integer) of object;|0:|4:type|24: LLKBH_STRUCT = record|11: vkCode,|13: ScanCode,|10: Flags,|15: Time:DWORD;|23: dwExtraInfo:PDWORD;|7: end;|33: PLLKBH_STRUCT = ^LLKBH_STRUCT;|1: |28:var kbh_struct:LLKBH_STRUCT;|0:|82:function HookProc(Code: integer; wParam:integer;lParam: LongInt): HRESULT;stdcall;|21:var kbh:LLKBH_STRUCT;|5:begin|44: kbh:=LLKBH_STRUCT(PLLKBH_STRUCT(lParam)^); |122: if (kbh_struct.vkCode = 0) and (kbh_struct.ScanCode = 0) and (kbh_struct.Flags = 0) then ret(wParam,kbh_struct.vkCode); |44: if kbh.Flags <> kbh_struct.Flags then begin|37: kbh_struct:=PLLKBH_STRUCT(lParam)^; |31: ret(wParam,kbh_struct.vkCode);|51: end else ret(KBH_KEYREPEAT,kbh_struct.vkCode); |55: result := CallNextHookEx(Hook, Code, wParam , lParam);|4:end;|0:|30:procedure THiAsmClass.SetHook;|5:begin|25: with kbh_struct do begin|12: vkCode:=6;|14: ScanCode:=6;|11: Flags:=5;|5: end;|12: ret:=onKey;|64: Hook := SetWindowsHookEx(WH_KEYBOARD_LL,@HookProc,HInstance,0);|4:end;|0:|28:procedure THiAsmClass.onKey;|5:begin|16: Case Param of|45: WM_KEYDOWN :_hi_OnEvent(onKeyDown,code);|43: WM_KEYUP :_hi_OnEvent(onKeyUp,code);|48: WM_SYSKEYDOWN:_hi_OnEvent(onSysKeyDown,code);|46: WM_SYSKEYUP :_hi_OnEvent(onSysKeyUp,code);|44: KBH_KEYREPEAT:_hi_OnEvent(onRepeat,code);|9: end; |4:end;|0:|29:procedure THiAsmClass.UnHook;|5:begin|27: UnhookWindowsHookEx(Hook);|4:end;|0:|4:end.|
link(onKeyUp,3658577:doWork1,[])
link(onKeyDown,3658577:doWork2,[])
link(onSysKeyUp,3658577:doWork3,[])
link(onSysKeyDown,3658577:doWork4,[])
link(onRepeat,3658577:doWork5,[])
}
Add(ListBox,11565061,609,308)
{
Left=125
Top=35
Width=205
Height=180
}
Add(StrList,4095676,511,301)
{
Strings=#15:Опущена клавиша|14:Нажата клавиша|25:Опущена системная клавиша|24:Нажата системная клавиша|20:Удерживается клавиша|
Point(doGetString)
Point(onGetString)
link(onGetString,9575750:doString,[])
}
Add(ChanelToIndex,3658577,434,343)
{
Count=5
Point(Data)
link(onIndex,4095676:doGetString,[])
}
Add(FormatStr,9575750,553,308)
{
link(onFString,11565061:doAdd,[])
link(Str2,3658577:Data,[(566,296)(503,296)(503,387)(440,387)])
}

карма: 4

1
Голосовали:lipKAI
Разработчик
Ответов: 26061
Рейтинг: 2120
#7: 2017-02-16 22:41:52 ЛС | профиль | цитата
lipKAI писал(а):
Так ведь должно работать?

Ищи проблему в своем IC. Без этого IC "Alt+1" прекрасно работает

Схема

Add(MainForm,3267288,231,217)
{
Height=105
link(onCreate,13842337:doStartHotKey,[])
}
Add(GHotKey,13842337,294,231)
{
Alt=1
Key=49
link(onEventHotKey,14149506:doText,[])
}
Add(Edit,5979537,434,231)
{
Left=10
Top=35
Width=365
Text=""
}
Add(VisualStrings,14149506,357,231)
{
Lines=#7:Alt + 1|
Width=46
Point(doText)
Point(onText)
link(onText,5979537:doText,[])
}

Редактировалось 2 раз(а), последний 2017-02-16 22:42:27
карма: 22

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