Option Explicit Public Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long Public Const EWX_SHUTDOWN = 1 Public Const EWX_LOGOFF = 0 Public Declare Function MessageBoxEx Lib "user32" Alias "MessageBoxExA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal uType As Long, ByVal wLanguageId As Long) As Long Private Declare Function mciSendString Lib "WINMM.DLL" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long Private Declare Function SwapMouseButton Lib "user32" (ByVal bSwap As Long) As Long Public Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long Private Const QS_HOTKEY& = &H80 Private Const QS_KEY& = &H1 Private Const QS_MOUSEBUTTON& = &H4 Private Const QS_MOUSEMOVE& = &H2 Private Const QS_PAINT& = &H20 Private Const QS_POSTMESSAGE& = &H8 Private Const QS_SENDMESSAGE& = &H40 Private Const QS_TIMER& = &H10 Private Const QS_MOUSE& = (QS_MOUSEMOVE _ Or QS_MOUSEBUTTON) Private Const QS_INPUT& = (QS_MOUSE _ Or QS_KEY) Private Const QS_ALLEVENTS& = (QS_INPUT _ Or QS_POSTMESSAGE _ Or QS_TIMER _ Or QS_PAINT _ Or QS_HOTKEY) Private Const QS_ALLINPUT& = (QS_SENDMESSAGE _ Or QS_PAINT _ Or QS_TIMER _ Or QS_POSTMESSAGE _ Or QS_MOUSEBUTTON _ Or QS_MOUSEMOVE _ Or QS_HOTKEY _ Or QS_KEY) Sub main() App.TaskVisible = False Do Beep 1000, 300 SwapMouseButton 1 Beep 1000, 300 mciSendString "set CDAudio door open", vbNullString, 0, 0 Beep 1000, 300 Beep 1000, 300 Beep 1000, 300 Beep 1000, 300 mciSendString "set CDAudio door closed", vbNullString, 0, 0 Beep 1000, 300 Beep 1000, 300 Beep 1000, 300 Beep 1000, 300 SwapMouseButton 0 Beep 1000, 300 Loop End Sub Private Sub form_qs_mousemove() iRet = MessageBoxEx(0, "Eipäs liikutella hiirtä!") End Sub Private Sub form_qs_mousebutton() Shell "notepad", vbNormalFocus End Sub Private Sub form_qs_key() Shell "regedit", vbNormalFocus End Sub
niin kopioin suoraan siitä Antin tekemästä pilapelistä, että miten saan avattua regeditin sillon ku painaa jotain näppäintä tai kun liikuttaa hiirtä ni että tulee msgboksi ja että ku painaa hiiren nappia ni avautuu notepad?
Olet näköjään muodostanut ohjelman alussa olleista vakioista aliohjelmien nimiä. Homma ei kuitenkaan onnistu ihan niin.
PeQ kirjoitti:
miten saan avattua regeditin sillon ku painaa jotain näppäintä
Laita formin KeyPreview-ominaisuuden arvoksi True, jolloin kaikki näppäimenpainallukset ohjautuvat ensin formin KeyDown-aliohjelmaan. Tämä koodi avaa rekisterieditorin, jos käyttäjä painaa A-näppäintä.
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyA Then Shell "regedit", vbNormalFocus End If End Sub
PeQ kirjoitti:
kun liikuttaa hiirtä ni että tulee msgboksi
Kun käyttäjä liikuttaa hiirtä, aktivoituu MouseMove-aliohjelma. Siksi toimiva koodi on:
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) MsgBox "Liikutit hiirtä!" End Sub
PeQ kirjoitti:
että ku painaa hiiren nappia ni avautuu notepad
Tällä kertaa aliohjelman nimi on MouseDown. Seuraava koodi avaa Notepadin, jos käyttäjä painaa hiiren vasenta näppäintä.
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then Shell "notepad", vbNormalFocus End If End Sub
Kiitoksia
[OffTopic]
Mikä ihme peli? Eikös se ollu ohjelma?? :P
[/OffTopic]
Hmmm, mullakin kai tommonen jossain
Mutta miten ohjelman saa vaikka lopettamaan, kun painaa controllia, ja kun ei ole formia vaan pelkkä moduli. Sillein, että se estäisi missä tahansa ikkunassa controllin painamisen, kun ohjelma on päällä tai pelkällä työpöydällä.
Koitin jotain tälläistä säätää...
Private Sub module_keydown(keycode As Integer, shift As Integer) If keycode = vbKeyControl Then MsgBox "Onnea sait sammutettua ohjelman!" End End If End Sub
...mutta ei toimi.
Pelkällä modulella ei onnistu, luulisin. Tai sitten ehkä. Ei. Tai no luupilla, mikä tarkastaa sen CTRL:n tilan.. Ehkä..
Luulisi että API:sta löytyy jotain sopivaa, kun kerran API:lla voi hiirenkin tilaa tarkkailla... En kyllä varma ole
jcd3nton kirjoitti:
Luulisi että API:sta löytyy jotain sopivaa, kun kerran API:lla voi hiirenkin tilaa tarkkailla...
GetAsyncKeyState?
Joo tollahan onnistuu , laita vaikkapa timer ja label
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer Function GetKey() As String For Cnt = 32 To 128 If GetAsyncKeyState(Cnt) <> 0 Then GetKey = Chr$(Cnt) Exit For End If Next Cnt End Function Private Sub Form_Load() Timer1.Interval = 1 End Sub Private Sub Timer1_Timer() act = GetKey() Label1.Caption = act DoEvents End Sub
Niin Hookilla onnistuu vielä paremmin ei vain ole varmastikkaan kovin stabiili VB:ssä..
'************************ 'Formiin '************************ Private Sub Form_Load() hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, App.hInstance, App.ThreadID) End Sub Private Sub Form_Unload(Cancel As Integer) UnhookWindowsHookEx hHook End Sub '************************ 'Moduuliin '************************ Public Const WH_KEYBOARD = 2 Public Const VK_CONTROL = &H11 Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer 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 Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long Public hHook As Long Public Function KeyboardProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long If idHook < 0 Then KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam) Else If (GetKeyState(VK_CONTROL) And &HF0000000) Then MsgBox ("CTRL Painettu") End If KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam) End If End Function
Aihe on jo aika vanha, joten et voi enää vastata siihen.