Hey guys,
I add a hotkey using RegisterHotkey but it doesn't work what's wrong?
Here is the peice of code:


;######################################################################
;
; WndProc - procedura glownego okna programu
;
;
;
;
;######################################################################


include Dialer.inc


;######################################################################
;
; Stale: identyfikatory obiektow formy, stringi
;
;######################################################################

.const

szBlank db 0,0
public szAppName
szAppName db "Dialer by Liquid",0

szErr_NoSel db "Select connection first.",0
szErr_CantConn db "Can't initialize connection.",0

szINIFile db "LDialer.ini",0 ; plik konfiguracyjny
szSection1 db "Options",0 ; sekcje i wartosci w pliku INI

szKey1 db "Number",0
szKey3 db "Password",0
szKey2 db "Login",0
szKey4 db "Selected",0
szKey5 db "Infinite",0
szKey6 db "AutoStart",0
szKey7 db "AutoDial",0
szKey8 db "Retries",0
szKey9 db "RunMinimized",0
szKey10 db "WaveFile",0
szKey11 db "PlaySound",0
szKey12 db "Reconnect",0
openfile db "open",0
;######################################################################
;
; zmienne: obiekty, struktury, inne zmienne
;
;######################################################################

.data

note NOTIFYICONDATA <> ; potrzebne by korzystac z tray'a
public rasParams
rasParams RASDIALPARAMSA <> ; parametry polaczenia, konieczne do wywolania RasDial

public nCount
nCount dd 0 ; uzywany jako licznik
nConnC dd 0 ; j.w. zlicza proby polaczen
public nValue
nValue dd 0

public bAStart
bAStart dd 0
public bInfinite
bInfinite dd 0
public bADial
bADial dd 0
public bRMinim
bRMinim dd 0
public bPlaySnd
bPlaySnd dd 0
public bReconnect
bReconnect dd 0
public bReconn
bReconn dd 0

.data?

extern hInstance:DWORD
extern hIcon:DWORD
extern nMemAddr:DWORD ; adres pamieci przydzielonej dynamicznie

extern hRThread:DWORD

public hConnection
hConnection dd ? ; uchwyt isntniejacego polaczenia po wywolaniu RasDial
hPopupMenu dd ? ; uchwyt Menu poderecznego programu
hStatusPopup dd ?
public hThread
hThread dd ? ; uchwyt nowego watku
public hMThread
hMThread dd ? ; uchwyt watku minimalizujacego okno glowne
public hSThread
hSThread dd ?
public hDThread
hDThread dd ?
hStatusWnd dd ? ; uchwyt StatusBar'a
public bConnect
bConnect dd ? ; flaga, czy polaczenie istnieje
public hDlg
hDlg dd ?
public hOpts
hOpts dd ?
public szWaveFile
szWaveFile db 512 dup (?)

.code

;######################################################################
;
; Glowna procedura okna programu, zdarzenia itp.
;
;######################################################################


WndProc proc hWnd:HWND,uMsg:DWORD, wParam:DWORD, lParam:DWORD


LOCAL nSize:DWORD
LOCAL nConn:DWORD
LOCAL szName[512]:BYTE
LOCAL szTemp[256]:BYTE
LOCAL pt:POINT
LOCAL rcSize:RECT
LOCAL szSecret[10]:BYTE
LOCAL rasStatus:RASCONNSTATUSA
LOCAL ti:TOOLINFO



pushad

;######################################################################
; Procedura inicjalizacyjna, czyli co prog ma zrobic gdy sie uruchomi
;######################################################################




.if uMsg==WM_INITDIALOG ; to co zrobimy gdy uworzy sie okno glowne


push [hWnd]
pop [hDlg]
; invoke SendMessage,hWnd,WM_SETHOTKEY,VK_F12,0

; invoke RegisterHotKey, hWnd, zID, MOD_CONTROL or MOD_ALT, VK_F11
; ########################## TOOLTIP ##################################
invoke RegisterHotKey, hWnd, IDC_DIAL, MOD_CONTROL, VK_F11;Here I add my hotkey combination
szText szToolTip,"Tooltips_class32"
invoke CreateWindowEx, WS_EX_TOPMOST, offset szToolTip, NULL, 0, \
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, \
NULL, NULL, hInstance, NULL

mov ebx, eax
mov ti.cbSize,sizeof TOOLINFO
mov ti.uFlags,TTF_SUBCLASS+TTF_IDISHWND
mov ti.hWnd, 0
push hInstance
pop ti.hInst
push hWnd
pop ti.uId
szText szBTip,"Yeah, u now see a tooltip. Cool huh? ;-)"
mov ti.lpszText,offset szBTip
invoke SendMessage,ebx,TTM_ADDTOOL,0,addr ti
invoke SendMessage,ebx,TTM_SETDELAYTIME,TTDT_INITIAL,10000
invoke SendMessage,ebx,TTM_SETDELAYTIME,TTDT_AUTOPOP,2000



invoke LoadMenu,hInstance,IDM_MENU
invoke SetMenu,hWnd,eax

invoke CreateStatusWindow,WS_CHILD or WS_VISIBLE or SBS_SIZEGRIP,offset szBlank,hWnd,IDC_STATUS
mov hStatusWnd,eax ; tworzymy statusbar i zapisujemy handle

sub eax,eax
invoke SetTimer,eax,eax,200,offset StatusThread
mov hThread,eax

invoke SendMessage,hWnd,WM_SETICON,TRUE,hIcon ; ustawiamy ikone dla okna glownego

invoke GetDlgItem,hWnd,IDC_HANGUP
invoke EnableWindow,eax,FALSE

;##################### Tworzenie popup menu #####################

invoke CreatePopupMenu ; tworzymy PopupMenu
mov hPopupMenu,eax ; zapisujemy jego handle
push eax
pop ebx
szText szMenu1,"&Open program" ; tworzymy kolejne pozycje w menu
invoke AppendMenu,ebx,MF_STRING,IDM_RESTORE,offset szMenu1
invoke AppendMenu,ebx,MF_SEPARATOR,NULL,NULL
szText szMenu2,"&Exit"
invoke AppendMenu,ebx,MF_STRING,IDM_EXIT,offset szMenu2

;##################### Tworzenie popup menu do statusu #########

invoke CreatePopupMenu
mov hStatusPopup,eax
push eax
pop ebx
szText szMenu11,"Clear log"
invoke AppendMenu,ebx,MF_STRING,IDM_RESTORE,offset szMenu11
szText szMenu12,"Save log to file..."
invoke AppendMenu,ebx,MF_STRING,IDM_RESTORE,offset szMenu12


; ################### Tworzenie ikony w trayu ####################

mov note.cbSize,sizeof NOTIFYICONDATA ; ustawiamy parametry by umiescic ikone w trayu
push hWnd
pop note.hwnd ; zapisanie handle okna
mov note.uID,IDI_TRAY ; identyfikator ikony
mov note.uFlags,NIF_ICON+NIF_MESSAGE+NIF_TIP ; parametry ( Ikona, komunikat oraz hint
mov note.uCallbackMessage,WM_SHELLNOTIFY ; komunikat wysylany do okna przy zdarzeniu
invoke LoadIcon,hInstance,IDI_ICON ; pobranie ikony z zasobow i zapis
mov note.hIcon,eax
invoke lstrcpy,addr note.szTip,addr szAppName ; ustawienie stringa na hint
invoke Shell_NotifyIcon,NIM_ADD,addr note ; umieszczenie ikony w tray'u

;################# Wyszukanie dostepnych polaczen #############

sub eax,eax ; wyzerowanie parametrow, konieczne przed wywolaniem
mov nSize,eax
mov nConn,eax

invoke RasEnumEntries,NULL,NULL,nMemAddr,addr nSize,addr nConn ; zwraca rozmiar poptrzebnej pamieci

mov edi,nMemAddr ; pierwsza struktura RASENTRYNAME musi miec odpowiedni dwSize
push [nSize]
pop [edi]

mov edi,nMemAddr
mov eax,RASENTRYSIZE
mov [edi],eax

invoke RasEnumEntries,NULL,NULL,nMemAddr,addr nSize,addr nConn ; pobranie dostepnych polaczen

sub esi,esi
mov edi,nMemAddr
assume edi:ptr RASENTRYNAMEA
.while esi!=[nConn] ; petla w ktorej dodajemy pozycje do combobox'a
invoke lstrcpy,addr szName,addr [edi].szEntryName ; skopiowanie stringa ktory bedzie wyswietlony
invoke SendDlgItemMessage,hWnd,IDC_COMBO,CB_ADDSTRING,0,addr szName ; dodanie stringa do comboboxa
add edi,RASENTRYSIZE ; pustawienie pointera na nastepnu wpis
inc esi
.endw

; ###################### Odczytanie ustawien zapisanych w pliku #########

invoke GetPrivateProfileString,offset szSection1,offset szKey1,addr szBlank,addr szName,255,offset szINIFile
invoke SetDlgItemText,hWnd,IDE_NUMBER,addr szName

invoke GetPrivateProfileString,offset szSection1,offset szKey2,addr szBlank,addr szName,255,offset szINIFile
invoke SetDlgItemText,hWnd,IDE_LOGIN,addr szName

invoke GetPrivateProfileString,offset szSection1,offset szKey3,addr szBlank,addr szName,255,offset szINIFile
invoke SetDlgItemText,hWnd,IDE_PASS,addr szName

invoke GetPrivateProfileString,offset szSection1,offset szKey4,addr szBlank,addr szName,255,offset szINIFile
invoke SendDlgItemMessage,hWnd,IDC_COMBO,CB_FINDSTRINGEXACT,0,addr szName ; szuka nazwy zachowanego polaczenia
.if eax!=CB_ERR
invoke SendDlgItemMessage,hWnd,IDC_COMBO,CB_SETCURSEL,eax,0 ; jesli znaleziono - zaznaczamy
.endif

invoke GetPrivateProfileString,offset szSection1,offset szKey10,addr szBlank,addr szWaveFile,255,offset szINIFile

;####################### Sprawdzenie czy ma byc uruchomiony zminimalizowany ############

invoke GetPrivateProfileString,offset szSection1,offset szKey9,addr szBlank,addr szName,50,offset szINIFile
lea eax,szName
cmp byte ptr [eax],31h
jnz __not_checked0
mov dword ptr bRMinim,1
invoke PostMessage,hWnd,WM_SIZE,SIZE_MINIMIZED,0
__not_checked0:

invoke GetPrivateProfileString,offset szSection1,offset szKey11,addr szBlank,addr szName,50,offset szINIFile
lea eax,szName
cmp byte ptr [eax],31h
jnz __not_checked5
mov dword ptr bPlaySnd,1
__not_checked5:

invoke GetPrivateProfileString,offset szSection1,offset szKey5,addr szBlank,addr szName,50,offset szINIFile
lea eax,szName
cmp byte ptr [eax],31h
jnz __not_checked1
mov dword ptr bInfinite,1
__not_checked1:

invoke GetPrivateProfileString,offset szSection1,offset szKey6,addr szBlank,addr szName,50,offset szINIFile
lea eax,szName
cmp byte ptr [eax],31h
jnz __not_checked2
mov dword ptr bAStart,1
__not_checked2:

invoke GetPrivateProfileString,offset szSection1,offset szKey12,addr szBlank,addr szName,50,offset szINIFile
lea eax,szName
cmp byte ptr [eax],31h
jnz __not_checked6
mov dword ptr bReconnect,1
__not_checked6:

invoke GetPrivateProfileString,offset szSection1,offset szKey8,addr szBlank,addr szName,50,offset szINIFile

sub esi,esi
sub ebx,ebx
mov ecx,ebx
lea edi,szName
movsx esi,byte ptr [edi]
inc edi
__jump1:
lea eax,[ebx*4+ebx]
xor ecx,ecx
mov cl,[edi]
lea ebx,[eax*2+esi-30h]
mov esi,ecx
test esi,esi
jz __jump2
inc edi
jmp __jump1
__jump2:

mov nValue,ebx
mov nCount,ebx

invoke GetPrivateProfileString,offset szSection1,offset szKey7,addr szBlank,addr szName,50,offset szINIFile
lea eax,szName
cmp byte ptr [eax],31h
jnz __not_checked3
mov dword ptr bADial,1
invoke PostMessage,hDlg,WM_COMMAND,IDC_DIAL,0
__not_checked3:

;######################################################################
; Procedura zamkniecia programu; co ma sie wykonac po wyjsciu
;######################################################################

.elseif uMsg==WM_CLOSE

pushad
__exit_program:
szText szMsg1,"Are you sure you want quit?" ; obsluga pozniej
invoke MessageBoxA,hWnd,offset szMsg1,offset szAppName,MB_YESNO or MB_ICONQUESTION
.if eax==IDYES ; potwierdzenie checi zamkniecia programu
invoke UnregisterHotKey, hWnd,IDC_DIAL;zID
mov rasStatus.dwSize, 0A0h
invoke RasGetConnectStatus,hConnection,addr rasStatus
.if rasStatus.rasconnstate==RASCS_DONE
szText szMsg2,"Connection is now established. Close it?"
invoke MessageBoxA,hWnd,offset szMsg2,offset szAppName,MB_YESNOCANCEL or MB_ICONQUESTION
.if eax==IDYES
invoke UnregisterHotKey, hWnd,IDC_DIAL
invoke RasHangUp,hConnection
.elseif eax==IDCANCEL
jmp __nothing
.endif
.else
invoke RasHangUp,hConnection
.endif

invoke IsDlgButtonChecked,hWnd,IDC_INFINITE

invoke GetDlgItemText,hWnd,IDE_NUMBER,addr szName,255
invoke WritePrivateProfileString,offset szSection1,offset szKey1,addr szName, offset szINIFile

invoke GetDlgItemText,hWnd,IDE_LOGIN,addr szName,255
invoke WritePrivateProfileString,offset szSection1,offset szKey2,addr szName, offset szINIFile

invoke GetDlgItemText,hWnd,IDE_PASS,addr szName,255
invoke WritePrivateProfileString,offset szSection1,offset szKey3,addr szName, offset szINIFile

invoke WritePrivateProfileString,offset szSection1,offset szKey10,addr szWaveFile, offset szINIFile

invoke ConvertText,addr szName,[nValue]
;
invoke WritePrivateProfileString,offset szSection1,offset szKey8,addr szName, offset szINIFile

lea edx,szName
sub ebx,ebx

.if uMsg== WM_HOTKEY ;Here is my WM_HOTKEY

invoke PostMessage,hDlg,WM_COMMAND,IDC_DIAL,0
.endif
.if [bInfinite]==BST_CHECKED
mov byte ptr [edx],31h
mov byte ptr [edx+1],bl
.else
mov byte ptr [edx],30h
mov byte ptr [edx+1],bl
.endif

invoke WritePrivateProfileString,offset szSection1,offset szKey5,addr szName, offset szINIFile

lea edx,szName
sub ebx,ebx
.if bAStart==1
mov byte ptr [edx],31h
mov byte ptr [edx+1],bl
.else
mov byte ptr [edx],30h
mov byte ptr [edx+1],bl
.endif

invoke WritePrivateProfileString,offset szSection1,offset szKey6,addr szName, offset szINIFile

lea edx,szName
sub ebx,ebx
.if bADial==1
mov byte ptr [edx],31h
mov byte ptr [edx+1],bl
.else
mov byte ptr [edx],30h
mov byte ptr [edx+1],bl
.endif

invoke WritePrivateProfileString,offset szSection1,offset szKey7,addr szName, offset szINIFile

lea edx,szName
sub ebx,ebx
.if bRMinim==1
mov byte ptr [edx],31h
mov byte ptr [edx+1],bl
.else
mov byte ptr [edx],30h
mov byte ptr [edx+1],bl
.endif

invoke WritePrivateProfileString,offset szSection1,offset szKey9,addr szName, offset szINIFile

lea edx,szName
sub ebx,ebx
.if bPlaySnd==1
mov byte ptr [edx],31h
mov byte ptr [edx+1],bl
.else
mov byte ptr [edx],30h
mov byte ptr [edx+1],bl
.endif

invoke WritePrivateProfileString,offset szSection1,offset szKey11,addr szName, offset szINIFile

lea edx,szName
sub ebx,ebx
.if bReconnect==1
mov byte ptr [edx],31h
mov byte ptr [edx+1],bl
.else
mov byte ptr [edx],30h
mov byte ptr [edx+1],bl
.endif

invoke WritePrivateProfileString,offset szSection1,offset szKey12,addr szName, offset szINIFile

invoke SendDlgItemMessage,hWnd,IDC_COMBO,CB_GETCURSEL,0,0 ; sprawdza co zaznaczone
.if eax!=CB_ERR
lea ebx,szName
invoke SendDlgItemMessage,hWnd,IDC_COMBO,CB_GETLBTEXT,eax,ebx ; pobiera string zaznaczonego elementu
invoke WritePrivateProfileString,offset szSection1,offset szKey4,addr szName,offset szINIFile
.endif

invoke Shell_NotifyIcon,NIM_DELETE,addr note ; wywalamy ikone z traya, bo po co nam ona?

invoke EndDialog,hWnd,0 ; i wychodzimy
.endif
__nothing:
popad
sub eax,eax
ret
;######################################################################
; Procedura obslugi okna; jesli zminimalizowany - nie ma go na pasku zadan
;######################################################################

.elseif uMsg==WM_SIZE
.if wParam==SIZE_MINIMIZED
invoke ShowWindow,hWnd,SW_HIDE
.elseif wParam==SIZE_RESTORED
invoke ShowWindow,hWnd,SW_SHOW
.endif

;######################################################################
; Procedura obslugi ikony w trayu; zdarzenia
;######################################################################

.elseif uMsg==WM_SHELLNOTIFY
.if wParam==IDI_TRAY ; klikniecie na ikone w trayu?
.if lParam==WM_RBUTTONDOWN ; prawym klawiszem
invoke GetCursorPos,addr pt ; sprawdzamy gdzie znajduje sie mysz
invoke TrackPopupMenu,hPopupMenu,TPM_RIGHTALIGN,pt.x,pt.y,NULL,hWnd,NULL ; wyswietlamy menu
.elseif lParam==WM_LBUTTONDBLCLK ; to jednak byl lewy klawisz
invoke SendMessage,hWnd,WM_COMMAND,IDM_RESTORE,0
.endif
.endif

;######################################################################
; Procedura ponownego laczenia, jesli ustawione jest powtarzanie polaczenia
;######################################################################

.elseif uMsg==WM_CONNECT
invoke RasHangUp,hConnection

inc dword ptr [nConnC]

szText szRedial,"Redialing, attempt nr."
invoke lstrcpy,addr szName,offset szRedial
invoke lstrlen,offset szRedial

lea eax,[szName+eax]
invoke ConvertText,eax,[nConnC]

invoke SendDlgItemMessage,hDlg,IDC_LIST,LB_ADDSTRING,0,addr szName

.if [bInfinite]==1

invoke CreateThread,0,0,offset ConnectProc,0,0,offset hDThread
.else
cmp dword ptr [nCount],0
jz __end_calling
dec dword ptr [nCount]
jz __end_calling

invoke CreateThread,0,0,offset ConnectProc,0,0,offset hDThread
__end_calling:
.endif

;######################################################################
; Zdarzenia; polecenia uzytkownika
;######################################################################

.elseif uMsg==WM_COMMAND
pushad
mov eax,wParam
.if lParam==0
mov eax,wParam
.if ax==IDM_RESTORE
invoke SetForegroundWindow,hWnd

invoke ShowWindow,hWnd,SW_RESTORE ; przywracamy okno glowne

.elseif ax==IDM_EXIT
jmp __exit_program
.endif
.endif

;######################################################################
; Przycisk "Connect", uruchomienie procedury laczenia
;######################################################################

.if ax== IDC_DIAL


invoke SendDlgItemMessage,hWnd,IDC_LIST,LB_RESETCONTENT,0,0

invoke SendDlgItemMessage,hWnd,IDC_COMBO,CB_GETCURSEL,0,0 ; sprawdza co jest zaznaczone w combo boxie

.if eax==CB_ERR
invoke AddToList,offset szErr_NoSel ; jesli nic, wyswietla komunikat w oknie statusu
.else
mov ecx,sizeof RASENTRYNAME ; rozmiar
imul eax ; jest mnozony przez numer zaznaczonego polaczenia
mov edi,nMemAddr
assume edi:ptr RASENTRYNAMEA
add edi,eax ; ustawiamy pointer na wybrane polaczenie

push sizeof RASDIALPARAMSA+3 ; odpowiednie dwSize pierwszego wpisu
pop rasParams.dwSize

invoke SendDlgItemMessage,hWnd,IDC_COMBO,CB_GETCURSEL,0,0 ; sprawdza co zaznaczone
invoke SendDlgItemMessage,hWnd,IDC_COMBO,CB_GETLBTEXT,eax,offset rasParams.szEntryName
; i zapisuje nazwe w strukturze potrzebnej do wywolania
invoke lstrcpy,offset rasParams.szCallbackNumber, offset szBlank ; nie uzywane
invoke GetDlgItemText,hWnd,IDE_NUMBER,offset rasParams.szPhoneNumber,RAS_MaxPhoneNumber ; numer gdzie dzwonimy
invoke GetDlgItemText,hWnd,IDE_LOGIN,offset rasParams.szUserName,UNLEN ; login - "ppp"
invoke GetDlgItemText,hWnd,IDE_PASS,offset rasParams.szPassword,PWLEN ; haslo - "ppp"
invoke lstrcpy,offset rasParams.szDomain,offset szBlank ; nie uzywane

sub eax,eax
mov hConnection,eax
mov nConnC,eax
inc eax
mov [bConnect],eax

.if bReconnect==1
mov dword ptr [bReconn],1
.else
mov dword ptr [bReconn],0
.endif

mov eax,[nValue]
mov [nCount],eax

invoke ConnectProc
.if eax==0
inc dword ptr [nConnC]
invoke WindowsDisable
szText szNewText,"Dialing..."
invoke SendDlgItemMessage,hDlg,IDC_LIST,LB_ADDSTRING,0,addr szNewText
.else
invoke AddToList,offset szErr_CantConn ; nie powiodlo sie, modem moze byc zajety przez inny prog
.endif
.endif

;######################################################################
; Przycisk "Disconnect"; zakonczenie polaczenia / wywolywania polaczenia
;######################################################################

.elseif ax==IDC_HANGUP

invoke RasHangUp,hConnection

sub eax,eax
mov [bConnect],eax
invoke WindowsEnable ; uaktywniamy odpowiednie przyciski, etc
szText szERROR_Terminating,"Terminating..."
invoke SendDlgItemMessage,hDlg,IDC_LIST,LB_ADDSTRING,0,offset szERROR_Terminating

invoke KillTimer,0,hRThread

;######################################################################
; "Options" w menu glownym
;######################################################################

.elseif ax==IDM_OPTIONS

invoke DialogBoxParam,hInstance,IDD_OPTIONS,hDlg,offset OptionsProc,NULL

;######################################################################
; "Exit" w menu glownym
;######################################################################

.elseif ax==IDM_EXIT1
invoke SendMessage,hWnd,WM_COMMAND,IDM_EXIT,0

;######################################################################
; "About" w menu glownym
;######################################################################

.elseif ax==IDM_ABOUT
szText szAbout, "Dialer by Liquid ",13,10,"liquidx@go2.pl",13,10,13,10, \
"Special thanx to Aquarius",13,10,13,10,"23.9.2000"

invoke MessageBoxA,hWnd,offset szAbout,offset szAppName,MB_OK

;######################################################################
; "Save log..." w menu, zapisuje status do pliku
;#####################################################################

.elseif ax==IDM_LOG
invoke CreateThread,0,0,offset SaveLogThread,0,0,offset hMThread
.elseif ax==IDM_TIMER
invoke DialogBoxParamA,hInstance,2000,hWnd,offset TimerDlgProc,0
.endif

popad
.endif
__koniec:
popad

sub eax,eax ; coz... wychodzimy z procedury
ret
WndProc endp


;######################################################################
; Koniec programu
;######################################################################

end


Thanx

Posted on 2002-08-31 12:57:24 by Duker
May be registerhokey must be into other place?
Posted on 2002-09-01 14:44:24 by Duker
Guys Help me plz why don't you answer?
Posted on 2002-09-07 13:31:31 by Duker
Duker, taking a quick look through your code, my best guess is that the line


.if uMsg == WM_HOTKEY

should be changed to a .ELSEIF to be in the same .IF as WM_CLOSE and WM_SIZE, etc.
Otherwise, I think the assembler will take the code to be inside the WM_CLOSE and so will be skipped over if the uMsg is not WM_CLOSE

--Chorus
Posted on 2002-09-07 13:52:19 by chorus
Thanx Chorus, Nice guess I'll try and will post the answer whether if it works or not
Posted on 2002-09-07 14:08:57 by Duker
Here's a sample hotkey program:
[size=9]format pe gui 4.0

entry start

INCLUDE '\fasm\include\kernel.inc'
INCLUDE '\fasm\include\user.inc'
INCLUDE '\fasm\include\macro\stdcall.inc'
INCLUDE '\fasm\include\macro\import.inc'

section '.idata' import data readable writeable
library kernel, 'KERNEL32.DLL',\
user, 'USER32.DLL'
kernel:
import GetModuleHandle,'GetModuleHandleA'

user:
import RegisterClass,'RegisterClassA',\
CreateWindowEx,'CreateWindowExA',\
DefWindowProc,'DefWindowProcA',\
GetMessage,'GetMessageA',\
TranslateMessage,'TranslateMessage',\
DispatchMessage,'DispatchMessageA',\
LoadCursor,'LoadCursorA',\
PostQuitMessage,'PostQuitMessage',\
RegisterHotKey,'RegisterHotKey',\
UnregisterHotKey, 'UnregisterHotKey',\
MessageBox, "MessageBoxA"

start:

invoke LoadCursor, NULL, IDC_ARROW
mov [wc.hCursor], eax
mov [wc.lpfnWndProc], WndMsg
mov [wc.hbrBackground], COLOR_BTNFACE+1
mov [wc.lpszClassName], appclass
invoke RegisterClass, wc
invoke GetModuleHandle, NULL
invoke CreateWindowEx, NULL, appclass, appclass, WS_VISIBLE+WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,\
NULL, NULL, eax, NULL

__msg_lp:

invoke GetMessage, msg, NULL, 0, 0
test eax, eax
jz __msg_lp_ex
invoke DispatchMessage,msg
jmp __msg_lp

__msg_lp_ex:

retn

WndMsg:

hWnd equ DWORD [ebp+8]
iMsg equ DWORD [ebp+12]
lParam equ DWORD [ebp+16]
wParam equ DWORD [ebp+20]

CTRL_X = 1000
VK_X = 58h

push ebp
push esp
pop ebp

mov eax, iMsg

cmp eax, WM_HOTKEY
je __hotkey
cmp eax, WM_CREATE
je __create
cmp eax, WM_DESTROY
je __destroy
pop ebp
jmp [DefWindowProc]

__hotkey:

invoke MessageBox, 0, 0, 0, 0
jmp __lresult

__create:

invoke RegisterHotKey, hWnd, CTRL_X, MOD_CONTROL, VK_X
jmp __lresult

__destroy:

invoke UnregisterHotKey, hWnd, CTRL_X
invoke PostQuitMessage, NULL

__lresult:

xor eax,eax
leave
retn 16

appclass DB "Hotkey", 0
wc WNDCLASS
msg MSG[/size]
I'm too lazy too look at your code. :)

Also make sure RegisterHotKey returns succesfully. The problem might be that there is a possibility of a conflict. I mean that the key combination you tried to register already exists... MS suggests you use GlobalAddAtom to obtain the hotkey identifier.



Oh I forgot, during WM_HOTKEY, wParam contains the key identifier and lParam(HiWord == Virtual Key Code and LoWord == can either be MOD_ALT, MOD_CONTROL, MOD_SHIFT, MOD_WIN depending on what you specified on RegisterHotKey) so you might want to do some error checkings first, if you have more than 1 hot key registered.
Posted on 2002-09-07 14:12:11 by stryker
Thanx stryker,
But do I have to declare
VK_X =56h in MASM?
Posted on 2002-09-07 14:41:03 by Duker
no, you don't have to. It's already included on WINDOWS.inc. It's 58h not 56h - I should change the font formatting to remove confusion. :)

stupid terminal font. :)

I just changed the above formatting to lucida console.
Posted on 2002-09-07 14:52:21 by stryker
Thanks Stryker,
And another one question? don't you know a program that converts a button and shows you the code of the key?
Posted on 2002-09-07 15:00:15 by Duker
>> converts a button and shows
>> you the code of the key?

Could you elaborate more? I don't seem to understand the question? :stupid:
Posted on 2002-09-07 21:39:09 by stryker
How did you get the code of VK_X?
VK_X =58h? I need a program that will convert a virtual key to hex.
Thanx
Posted on 2002-09-14 07:12:22 by Duker