Поиск:

Ответ в темуСоздание новой темы Создание опроса
> программа регистрирующая быстрые клавиши 
:(
    Опции темы
denks
Дата 16.7.2006, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 16.4.2006

Репутация: нет
Всего: нет



Здравствуйте. Вот решил сделать программу, которая представляет из себя следующее. Она висит в памяти и при нажатии определённой быстрой клавиши (я хочу задействовать клавиши F1-F12) выполняет определённое действие - например очистка корзины, выдвинуть/задвинуть cd-rom и др.  Я так понял, мне следует воспользоваться функцией RegisterHotKey. Я в асме собственно новичок, можете подсказать, как реализовать данный подход. Желательно с примером. Заранее спасибо. 
PM MAIL   Вверх
denks
Дата 16.7.2006, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 16.4.2006

Репутация: нет
Всего: нет



Вот вроде начал потихоньку. Сделал заготовку - показывает сообщение при нажатии клавиши F1. А как реализовать несколько регистраций горячих клавиш, соответственно для того чтобы выполнять несколько действий. Текущий код ниже

Код

.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
.data
hHook            dd        0
msg            MSG        <>
messagetext db "Вы нажали клавишу F1",0
messagehandle db "тест",0
.code
start:
xor    ebx, ebx
push    VK_F1
push      0
push    0BADFACEh
push    ebx            ;
call    RegisterHotKey
push    ebx
push    eax
push     0
push    WH_KEYBOARD_LL
call    SetWindowsHookExA 
mov    [hHook], eax     
push    ebx            
push    ebx           
push    ebx
push    offset msg       
call    GetMessageA        
push    [hHook]             
call    UnhookWindowsHookEx   
invoke MessageBox,0,addr messagetext,addr messagehandle,0
invoke ExitProcess,0
end start

 
PM MAIL   Вверх
Exekutor
Дата 16.7.2006, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 1.11.2005
Где: Казахстан. Костан ай

Репутация: нет
Всего: 4



Вот небольшой пример:

Код

// файл dial1.rc
// определение констант
// стили окна
#define WS_SYSMENU       0x00080000L
#define WS_MINIMIZEBOX   0x00020000L
#define WS_MAXIMIZEBOX   0x00010000L

// текст в окне редактирования прижат к левому краю
#define ES_LEFT      0x0000L
// стиль всех элементов на окне
#define WS_CHILD     0x40000000L
// элементы на окне должны быть изначально видимы
#define WS_VISIBLE   0x10000000L
// бордюр вокруг элемента
#define WS_BORDER    0x00800000L
// при помощи TAB можно по очереди активизировать элементы
#define WS_TABSTOP   0x00010000L
// прижать строку к левому краю отведенного поля
#define SS_LEFT      0x00000000L
// стиль кнопка
#define BS_PUSHBUTTON  0x00000000L
// центрировать текст на кнопке
#define BS_CENTER     0x00000300L
#define DS_LOCALEDIT  0x20L

// определение диалогового окна
DIAL1 DIALOG 0, 0, 240, 120
STYLE WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX
CAPTION "Пример диалогового окна"
FONT 8, "Arial"
{
// поле редактирования, идентификатор 1
CONTROL "", 1, "edit", ES_LEFT | WS_CHILD
 | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 24, 20, 128, 12
// еще одно поле редактирования, идентификатор 2
CONTROL "", 2, "edit", ES_LEFT | WS_CHILD
 | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 24, 52, 127, 12
// текст, идентификатор 3
CONTROL "Строка 1", 3, "static", SS_LEFT 
 | WS_CHILD | WS_VISIBLE, 164, 22, 60, 8
// еще текст, идентификатор 4
CONTROL "Строка 2", 4, "static", SS_LEFT
 | WS_CHILD | WS_VISIBLE, 163, 54, 60, 8
// кнопка, идентификатор 5
CONTROL "Выход", 5, "button", BS_PUSHBUTTON
 | BS_CENTER | WS_CHILD | WS_VISlBLE | WS_TABSTOP,
 180, 76, 50, 14
}


Код

;файл dial1.inc
; константы
; сообщение приходит при закрытии окна
WM_CLOSE      equ  10h
WM_INITDIALOG equ 110h
WM_COMMAND    equ 111h
WM_SETTEXT    equ  0Ch
WM_HOTKEY     equ 312h
EN_SETFOCUS   equ 100h
EN_KILLFOCUS  equ 200h

; прототипы внешних процедур
EXTERN      UnregisterHotKey@8:NEAR
EXTERN      RegisterHotKey@16:NEAR
EXTERN      MessageBoxA@16:NEAR
EXTERN      ExitProcess@4:NEAR
EXTERN      GetModuleHandleA@4:NEAR
EXTERN      DialogBoxParamA@20:NEAR
EXTERN      EndDialog@8:NEAR
EXTERN      SendMessageA@16:NEAR
EXTERN      GetDlgItem@8:NEAR
EXTERN      MessageBoxA@16:NEAR

; структуры
; структура сообщения
MSGSTRUCT STRUC
     MSHWND     DWORD ?
     MSMESSAGE  DWORD ?
     MSWPARAM   DWORD ?
     MSLPARAM   DWORD ?
     MSTIME     DWORD ?
     MSPT       DWORD ?
MSGSTRUCT ENDS


Код

;файл dial.asm
.386P
; плоская модель
.MODEL FLAT, stdcall
include dial1.inc
; директивы компоновщику для подключения библиотек
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
; ------------------------------------------------------------
; сегмент данных DATA SEGMENT DWORD PUBLIC USE32 'DATA'
     MSG   MSGSTRUCT <?>
     HINST DD 0    ; дескриптор приложения
     PA    DB "DIAL1",0
     STR1  DB "Неправильный символ !",0
     STR2  DB "Ошибка !",0
; таблица для создания горячих клавиш
TAB  DB 32,33,34,35,36,37,38,39,40
     DB 41,42,43,44,45,46,47,58,59,60
     DB 61,62,63,64,65,66,67,68,69,70
     DB 71,72,73,74,75,76,77,78,79,80
     DB 81,82,83,84,85,86,87,88,89,90
     DB 91,92,93,94,95,96,97,98,99,100
     DB 101,102,103,104,105,106,107,108,109,110
     DB 111,112,113,114,115,116,117,118,119,120
     DB 121,122,123,124,125,126,127,128,129,130
     DB 131,132,133,134,135,136,137,138,139,140
     DB 141,142,143,144,145,146,147,148,149,150
     DB 151,152,153,154,155,156,157,158,159,160
     DB 161,162,163,164,165,166,167,168,169,170
     DB 171,172,173,174,175,176,177,178,179,180
     DB 181,182,183,184,185,186,187,188,189,190
     DB 191,192,193,194,195,196,197,198,199,200
     DB 201,202,203,204,205,206,207,208,209,210
     DB 211,212,213,214,215,216,217,218,219,220
     DB 221,222,223,224,225,226,227,228,229,230
     DB 231,232,233,234,235,236,237,238,239,240
     DB 241,242,243,244,245,246,247,248,249,250
     DB 251,252,253,254,255
_DATA ENDS

; сегмент кода
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
START:
; получить дескриптор приложения
     PUSH 0
     CALL GetModuleHandleA@4
     MOV [HINST], EAX
;----------------------------------------
     PUSH 0
     PUSH OFFSET WNDPROC
     PUSH 0
     PUSH OFFSET PA
     PUSH [HINST]
     CALL DialogBoxParamA@20
     CMP EAX,-1
     JNE KOL
KOL:
;----------------------------------------
     PUSH 0 CALL
     ExitProcess@4
;----------------------------------------
; процедура окна
; расположение параметров в стеке
; [EBP+014Н]  ; LPARAM
; [EBP+10H]   ; WAPARAM
; [EBP+0CH]   ; MES
; [EBP+8]     ; HWND
WNDPROC     PROC
     PUSH EBP
     MOV EBP,ESP
     PUSH EBX
     PUSH ESI
     PUSH EDI
;----------------------------------------
     CMP DWORD PTR [EBP+0CH], WM_CLOSE
     JNE L1
     PUSH 0
     PUSH DWORD PTR [EBP+08H]
     CALL EndDialog@8
     MOV EAX, 1
     JMP FIN
L1:
     CMP DWORD PTR [EBP+0CH],WM_INITDIALOG
     JNE L2
; здесь заполнить окна редактирования, если надо
;
;
     MOV EAX, 1
     JMP FIN
L2:
     CMP DWORD PTR [EBP+0CH],WM_COMMAND
     JNE L5
; кнопка выхода ?
     CMP WORD PTR [EBP+10H], 5
     JNE L3
     PUSH 0
     PUSH DWORD PTR [EBP+08H]
     CALL EndDialog@8
     MOV EAX, 1
     JMP FIN
L3:
     CMP WORD PTR [EBP+10H], 1
     JNE FINISH
; блок обработки сообщений первого окна редактирования
     CMP WORD PTR [EBP+12H], EN_KILLFOCUS
     JNE L4
; окно редактирования с идентификатором 1 теряет фокус
     MOV EBX, 0
; снимаем все горячие клавиши
L33:
     MOVZX EAX,BYTE PTR [ТАВ+EBX]
     PUSH EAX
     PUSH DWORD PTR [EBP+08Н]
     CALL UnregisterHotKey@8
     INC EBX
     CMP EBX, 214
     JNE L33
     MOV EAX, 1
     JMP FIN
L4:
     CMP WORD PTR [EBP+12H],EN_SETFOCUS
     JNE FINISH
; окно редактирования с идентификатором 1 получает фокус
     MOV EBX, 0
; устанавливаем горячие клавиши
L44:
     MOVZX EAX,BYTE PTR [ТАВ+EBX]
     PUSH EAX
     PUSH 0
     PUSH EAX
     PUSH DWORD PTR [EBP+08Н]
     CALL RegisterHotKey@16
     INC EBX
     CMP EBX, 214
     JNE L44
     MOV EAX, 1
     JMP FIN
L5:
     CMP DWORD PTR [EBP+0CH],WM_HOTKEY
     JNE FINISH
; здесь реакция на неправильно введенный символ
     PUSH 0         ; МВ_ОК
     PUSH OFFSET STR2
     PUSH OFFSET STR1
     PUSH DWORD PTR [EBP+08Н] ; дескриптор окна
     CALL MessageBoxA@16
FINISH:
     MOV EAX, 0
FIN:
     POP EDI
     POP ESI
     POP EBX
     POP EBP
     RET 16
WNDPROC ENDP
_TEXT ENDS
END START


Добавлено @ 21:05 
Надеюсь, ты почерпнешь отсюда полезную информацию smile  


--------------------
[color=blue][size=2]En taro addun, ma sol larinas[/size][/color]
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0933 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.