|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
Вот взято из MSDN
Код:
hhook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hinst, 0); LRESULT LowLevelKeyboardProc(INT nCode, WPARAM wParam, LPARAM lParam) { static BOOL fShiftPressed = FALSE; BOOL fHandled = FALSE; if (nCode == HC_ACTION) { KBDLLHOOKSTRUCT *pkbdllhook = (KBDLLHOOKSTRUCT *)lParam; switch (wParam) { case WM_SYSKEYDOWN: switch (pkbdllhook->vkCode) { case VK_LSHIFT: case VK_RSHIFT: { // the user pressed the shift key fShiftPressed = TRUE; break; } case VK_TAB: { if (pkbdllhook->flags & LLKHF_ALTDOWN) { // the user pressed Alt+Tab, execute AltTab hotkey handler fHandled = TRUE; } break; } case VK_ESCAPE: { if (pkbdllhook->flags & LLKHF_ALTDOWN) { // the user pressed Escape, end the AltTab container // window without switching the selected window fHandled = TRUE; } break; } } break; case WM_KEYUP: case WM_SYSKEYUP: switch (pkbdllhook->vkCode) { case VK_LMENU: case VK_RMENU: { // the user let go of the Alt key, end the AltTab container // window switching to the selected window break; } case VK_LSHIFT: case VK_RSHIFT: { // the user released the shift key fShiftPressed = FALSE; break; } } break; } } return (fHandled ? TRUE : CallNextHookEx(hhook, nCode, wParam, lParam)); } Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 06.10.2012 в 00:04. |
#17
|
||||
|
||||
Код:
case WM_SYSKEYUP: switch (pkbdllhook->vkCode) { case VK_LMENU: case VK_RMENU: { // the user let go of the Alt key, end the AltTab container // window switching to the selected window break; } case VK_LSHIFT: case VK_RSHIFT: { // the user released the shift key fShiftPressed = FALSE; break; } } Програмистами не рождаются, ими становятся! |
#18
|
||||
|
||||
Обрати внимание, в коде 2 раза проверяется на Shift.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#19
|
||||
|
||||
да, я заметил,.. нажатие и отпускание,.. попробую может получится
А вспомнил, каким образом обрабатывается нажатие 2-х клавиш. в частности Шифт и Капс??? в HC_ACTION оно отображает только последнее нажатое... кажется есть одна идея но не уверен Програмистами не рождаются, ими становятся! Последний раз редактировалось SCrat.ORS, 06.10.2012 в 00:11. |
#20
|
||||
|
||||
Цитата:
Выложил "tricky lite"-версию модуля System для Delphi 6/7, доработанную уже после KOL:
Заодно выложил сборку BorlndMM.dll на основе FastMM, используемую как замена оригинального BorlndMM.dll в Delphi 2-7 и заодно как подгружаемая библиотека в ShareMM. Из-за легкой версии System заменитель имеет меньший размер чем оригинал, и это при увеличенной производительности. Залил также CapSwitch как пример кода. Все права сохранены. Я обычно поддерживаю и развиваю лишь те программы, которыми пользуюсь сам. CapSwitch использовать не планирую, оттого и ветка Abandoned. Перезалил также архив с lite-версией программы. Он временный, и через какое-то время удалю. Типа, компилируйте сами. Думается, как-нибудь опишу в блоге, что и как с этим "tricky lite". |
#21
|
||||
|
||||
angvelem, спасибо, навел меня на правильную мысль, все заработало как положено. Ссылка на исходники в 1 посте.
Програмистами не рождаются, ими становятся! |
#22
|
||||
|
||||
Freeman, я конечно понимаю свою не компетентность, но как эти модули запилить в делфи? Скопировать в ..\source\Win32\rtl\sys\ - не помогло, после компиляции все-равно вес программы 83 кб. Помоги пожалуйста.
Програмистами не рождаются, ими становятся! |
#23
|
||||
|
||||
Вот набросок:
Код:
unit MyThread; interface uses Windows; type TKbLEDTag = (kbledNum, kbledCaps, kbledScroll); TLedScroll = class private fHandle : HWND; fDummy : DWORD; fSuspend : Boolean; public constructor Create(Suspend : Boolean); procedure Resume; procedure Suspend; procedure Terminate; property Handle : HWND read fHandle; end; const LangKbLED = kbledScroll; // LED to indicate language var EnUS : Boolean; OldEnUS : Boolean = True; Msg : TMsg; implementation procedure ToggleKeybrdLED(LEDTag: TKbLEDTag); procedure SimulateLkKey(KeyDown: Boolean); const VKeyCodes : array[TKbLEDTag] of Byte = (VK_NUMLOCK, VK_CAPITAL, VK_SCROLL); ScanCodes : array[TKbLEDTag] of Byte = ($45, $3A, $46); begin keybd_event(VKeyCodes[LEDTag], ScanCodes[LEDTag], KEYEVENTF_EXTENDEDKEY or Ord(not KeyDown) * KEYEVENTF_KEYUP, 0); end; begin SimulateLkKey(True); SimulateLkKey(False); end; function ThreadProc : DWORD; stdcall; var Msg : TMsg; begin if PostThreadMessage(GetCurrentThreadId, 0, 0, 0) then GetMessage(Msg, 0, 0, 0); while True do begin EnUS := GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow)) and $FFFF = $0409; if EnUS <> OldEnUS then begin ToggleKeybrdLED(LangKbLED); OldEnUS := EnUS; end; Sleep(100); end; end; constructor TLedScroll.Create(Suspend : Boolean); const Bol : array[Boolean] of DWORD = (0, CREATE_SUSPENDED); begin fHandle := CreateThread(NIL, 0, @ThreadProc, NIL, Bol[Suspend], fDummy); fSuspend := Suspend; end; procedure TLedScroll.Resume; begin if fSuspend then begin ResumeThread(fHandle); fSuspend := False; end; end; procedure TLedScroll.Suspend; begin if not fSuspend then begin SuspendThread(fHandle); fSuspend := True; end; end; procedure TLedScroll.Terminate; begin if fHandle <> 0 then begin ExitThread(0); fHandle := 0; end; end; end. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#24
|
||||
|
||||
Нужно на сайте KOL скачать сам KOL и легкие замены SysUtils и Classes. Настроить пути в проекте и попробовать собрать. Размер должен уменьшиться.
После этого можно экспериментировать с заменой System, для чего найти сначала на сайте KOL версию под свой компилятор. Ну, и читать, что написано на сайте (или где? не помню) и в самих модулях. |
#25
|
||||
|
||||
продолжение:
Код:
program CapSwitch; uses Windows, MyThread; type TKBDLLHOOKSTRUCT = record vkCode : DWORD; scanCode : DWORD; flags : DWORD; time : DWORD; dwExtraInfo : DWORD; end; PKBDLLHOOKSTRUCT = ^TKBDLLHOOKSTRUCT; const WH_KEYBOARD_LL = 13; var hhkLowLevelKybd : HHOOK; Mutex : THandle; aLedscroll : TLedScroll;//TThread; //------------------------------------------------------------------------------ function LowLevelKeyboardProc(nCode: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; var fEatKeystroke : Boolean; p : PKBDLLHOOKSTRUCT; Wnd : HWND; begin fEatKeystroke := False; if nCode = 0 then begin case wParam of 256 : begin p := PKBDLLHOOKSTRUCT(lParam); fEatKeystroke := (p^.vkCode = 20); end; end; end; if fEatKeystroke then begin Wnd := GetForegroundWindow; PostMessage(Wnd, 80, 0, HKL_NEXT); Result := 1; end else Result := CallNextHookEx(0, nCode, wParam, lParam); end; //------------------------------------------------------------------------------ begin // Install the low-level keyboard & mouse hooks hhkLowLevelKybd := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0); Mutex := CreateMutex(nil, True, 'CapSwitch_Running'); if WaitForSingleObject(Mutex, 0) <> WAIT_OBJECT_0 then Exit; aLedscroll := TLedscroll.Create(True); aLedscroll.Resume; while GetMessage(msg, 0, 0, 0) do begin TranslateMessage(msg); DispatchMessage(msg); end; // Remove hooks if aLedscroll.Handle <> 0 then aLedscroll.Terminate; UnhookWindowsHookEx(hhkLowLevelKybd); end. И забей на KOL большой болт, кака неимоверная и давно умершая. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#26
|
||||
|
||||
Все конечно хорошо, если не учитывать что либы - MyThread нету
Програмистами не рождаются, ими становятся! |
#27
|
||||
|
||||
Цитата:
|
#28
|
||||
|
||||
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 06.10.2012 в 01:13. |
#29
|
||||
|
||||
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#30
|
||||
|
||||
11 кб получилось...
Програмистами не рождаются, ими становятся! |