/ Forside / Teknologi / Udvikling / VB/Basic / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
VB/Basic
#NavnPoint
berpox 2425
pete 1435
CADmageren 1251
gibson 1230
Phylock 887
gandalf 836
AntonV 790
strarup 750
Benjamin... 700
10  tom.kise 610
Hvordan fanger man Tab-tasten?
Fra : Frank Bertelsen


Dato : 10-01-02 20:17

Er der nogen der ved, hvordan man fanger tryk på tabuleringstasten i en
Visual Basic form? Hverken KeyDown eller KeyPress bliver kaldt. Jeg har prøvet
både med og uden KeyPreview på formen. Jeg kan godt fange Tab-tasten når den
bruges internt i en komponent, som f.eks. hvis man tabulerer i teksten i en
multiline textbox, men ikke når den bruges til at tabulere mellem komponeterne
på formen.

Jeg giver mig gerne i kast med Windows API-kald, hvis det er det, der skal til.


--
Posted via Mailgate.ORG Server - http://www.Mailgate.ORG

 
 
Mikkel Bundgaard (10-01-2002)
Kommentar
Fra : Mikkel Bundgaard


Dato : 10-01-02 20:30

"Frank Bertelsen" <fb@schultz.dk> wrote in message
news:b5d0ec2abe5ad8244ee15ecadba4faec.8017@mygate.mailgate.org...
> Er der nogen der ved, hvordan man fanger tryk på
> tabuleringstasten i en Visual Basic form? Hverken KeyDown
> eller KeyPress bliver kaldt. Jeg har prøvet både med og uden
> KeyPreview på formen. Jeg kan godt fange Tab-tasten når den
> bruges internt i en komponent, som f.eks. hvis man tabulerer i
> teksten i en multiline textbox, men ikke når den bruges til at
> tabulere mellem komponeterne på formen.
>
> Jeg giver mig gerne i kast med Windows API-kald, hvis det er
> det, der skal til.
Hej Frank

Jeg ved ikke om der er forskel på VB og VBA på dette punkt med
nedenstående procedure "fanger" TAB, selvom den flytter fokus
videre til næste komponent. Men da jeg ikke har VB, kan jeg
desværre ikke teste den i andet end Access

Private Sub Tekst0_KeyDown(KeyCode As Integer, _
Shift As Integer)
If KeyCode = vbKeyTab Then
MsgBox "Du trykkede TAB"
End If
End Sub

Håber du kan bruge det til noget
--
Mikkel Bundgaard
IT University of Copenhagen
http://officehelp.gone.dk
Codito, Ergo Sum



Frank Bertelsen (10-01-2002)
Kommentar
Fra : Frank Bertelsen


Dato : 10-01-02 20:45

Hej Mikkel,

Nej, det virker desværre ikke i VB.


--
Posted via Mailgate.ORG Server - http://www.Mailgate.ORG

Carsten Suurland (10-01-2002)
Kommentar
Fra : Carsten Suurland


Dato : 10-01-02 22:53

Hej Frank

Det du skal, er at "hokke" keyboardet.
Det gøres ved at oprette en såkald "callback" procedure som Windows
efterfølgende kalder, hver gang der bliver rørt ved keyboardet. Du skal dog
være opmærksom på, at dette vil gælde for ALLE applikationer der kører...
ikke kun dit program.

Dette kan du dog tage højde for, ved at tjekke om din applikation er aktiv
eller ej.

I et modul skal du ligge følgende API med tilhørede callback procedure:

*******************************************************
Public Declare Function CallNextHookEx Lib "user32" _
(ByVal hHook As Long, _
ByVal nCode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

Public Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long

Public Declare Function SetWindowsHookEx Lib "user32" _
Alias "SetWindowsHookExA" _
(ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
ByVal dwThreadId As Long) As Long

Public Declare Function PostMessage Lib "user32" _
Alias "PostMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

Public Const WH_KEYBOARD = 2
Public Const KBH_MASK = &H20000000
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202

Public hHook As Long

Public Function KeyboardProc(ByVal nCode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
If nCode >= 0 Then
If wParam = Asc("C") Then
'gør et eller andet
KeyboardProc = 1
Exit Function
End If
End If
End If
KeyboardProc = CallNextHookEx(hHook, nCode, wParam, lParam)
End Function

*******************************************************
I en form (eller f.eks Sub Main) skal du indsætte følgende:

Private Sub Form_Load()
hHook = SetWindowsHookEx(WH_KEYBOARD, _
AddressOf KeyboardProc, _
0&, _
App.ThreadID)
End Sub

Private Sub Form_Unload(Cancel As Integer)
Call UnhookWindowsHookEx(hHook)
End Sub

*******************************************************
HUSK: Når du arbejder med API-kald der "hooker" eller "subclasser" så sørg
for altid at lukke dit program på "normal" vis... det vil sige ikke noget
med bruge stop-knappen på VB værktøjslinje... husk også ALTID at "un-hooke"
igen...

Jeg vedlægger hér mere om callback proceduren... (Det er taget fra MSDN)

KeyboardProc
The KeyboardProc hook procedure is an application-defined or library-defined
callback function used with the SetWindowsHookEx function. The system calls
this function whenever an application calls theGetMessage orPeekMessage
function and there is a keyboard message (WM_KEYUP orWM_KEYDOWN) to be
processed.

The HOOKPROC type defines a pointer to this callback function. KeyboardProc
is a placeholder for the application-defined or library-defined function
name.

LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
);

Parameters
code
Specifies a code the hook procedure uses to determine how to process the
message. This parameter can be one of the following values: Value Meaning
HC_ACTION The wParam and lParam parameters contain information about
a keystroke message.
HC_NOREMOVE The wParam and lParam parameters contain information
about a keystroke message, and the keystroke message has not been removed
from the message queue. (An application called the PeekMessage function,
specifying the PM_NOREMOVE flag.)


If code is less than zero, the hook procedure must pass the message to the
CallNextHookEx function without further processing and should return the
value returned by CallNextHookEx.

wParam
Specifies the virtual-key code of the key that generated the keystroke
message.
lParam
Specifies the repeat count, scan code, extended-key flag, context code,
previous key-state flag, and transition-state flag. This parameter can be a
combination of the following values: Value Description
0-15 Specifies the repeat count. The value is the number of times
the keystroke is repeated as a result of the user's holding down the key.
16-23 Specifies the scan code. The value depends on the original
equipment manufacturer (OEM).
24 Specifies whether the key is an extended key, such as a function
key or a key on the numeric keypad. The value is 1 if the key is an extended
key; otherwise, it is 0.
25-28 Reserved.
29 Specifies the context code. The value is 1 if the alt key is
down; otherwise, it is 0.
30 Specifies the previous key state. The value is 1 if the key is
down before the message is sent; it is 0 if the key is up.
31 Specifies the transition state. The value is 0 if the key is
being pressed and 1 if it is being released.


For more information about the lParam parameter, seeKeystroke Message Flags.

Return Values
If nCode is less than zero, the hook procedure must return the value
returned by CallNextHookEx.

If nCode is greater than or equal to zero, and the hook procedure did not
process the message, it is highly recommended that you call CallNextHookEx
and return the value it returns; otherwise, other applications that have
installed WH_KEYBOARD hooks will not receive hook notifications and may
behave incorrectly as a result. If the hook procedure processed the message,
it may return a nonzero value to prevent the system from passing the message
to the rest of the hook chain or the target window procedure.

Remarks
An application installs the hook procedure by specifying the WH_KEYBOARD
hook type and the address of the hook procedure in a call to the
SetWindowsHookEx function.

QuickInfo
Windows NT: Requires version 3.1 or later.
Windows: Requires Windows 95 or later.
Windows CE: Unsupported.
Header: Declared in winuser.h.
Import Library: User-defined.

See Also
Hooks Overview, Hook Functions, CallNextHookEx,GetMessage,PeekMessage,
SetWindowsHookEx,WM_KEYUP,WM_KEYDOWN



/Carsten Suurland




Frank Bertelsen (11-01-2002)
Kommentar
Fra : Frank Bertelsen


Dato : 11-01-02 13:27

Tusind tak Carsten. Det er lige hvad jeg har brug for.

Det anede mig nok, at det ikke kan lade sig gøre i ren VB.


--
Posted via Mailgate.ORG Server - http://www.Mailgate.ORG

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408526
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste