Dingojoe
April 15th, 1999, 11:24 PM
Is there any code out there that will allow me to make hotkeys when the program is minimized... eg... when you press a, somethign happens, same when u press b etc..
thanks
- joe
?
thanks
- joe
?
|
Click to See Complete Forum and Search --> : Hotkey? Dingojoe April 15th, 1999, 11:24 PM Is there any code out there that will allow me to make hotkeys when the program is minimized... eg... when you press a, somethign happens, same when u press b etc.. thanks - joe ? Lothar Haensler April 16th, 1999, 02:17 AM if you want to trap keyboard events even when your app is not active, you'll have to use windows hooks. Use the SetWindowsHookEx-API. Chris Eastwood April 16th, 1999, 03:32 AM Hi I was under the impression that you couldn't actually create a system - wide keyboard hook in VB. As I understand it, a VB Exe can only trap keyboard events in it's own process space. If you want to create a Keyboard hook, you'll need to use C/C++/Delphi or some other tool that can create DLL's. This DLL can then do a SendMessage to your VB application which you can capture with a subclassing routine. eg: #include "windows.h" #include "keyhook.h" #include "winuser.h" LRESULT CALLBACK KeyboardFunc (int nCode, WPARAM wParam, LPARAM lParam); HANDLE hInstance =0; HHOOK hhookKeyb =0; MSG Msg; BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD dwReason, LPVOID reserved) { hInstance = hinstDll; return TRUE; } LRESULT CALLBACK KeyboardFunc (int nCode, WPARAM wParam, LPARAM lParam) { LRESULT ret; /* Here we are in the Keyboard - Hook */ if (nCode < 0) return (CallNextHookEx(hhookKeyb, nCode, wParam, lParam)); else { ret = CallNextHookEx(hhookKeyb, nCode, wParam, lParam); if (wParam == 110) /* Which vKey is it??*/ /* Now do something (maybe post a message or so */ return 1; } else return ret; } } void InitKeyWatch (BOOL install) { if (install) { hhookKeyb = SetWindowsHookEx (WH_KEYBOARD, (HOOKPROC)KeyboardFunc, hInstance, 0); } else { UnhookWindowsHookEx(hhookKeyb); } } Regards Chris Eastwood CodeGuru - the website for developers http://www.codeguru.com/vb Lothar Haensler April 16th, 1999, 06:15 AM Oops, you are right. I think a keyboard hook MUST reside in a DLL. Sorry for the confusion. Dingojoe April 16th, 1999, 09:27 AM So i'd first install c++ (will borland do?) then paste that in and save it as a dll? Once it is saved, how do i use it(link it) in my vb app? ? Chris Eastwood April 16th, 1999, 09:45 AM Hi Borland C++ will be fine (in fact it's the only version of C++ I've ever used in anger). It's not as simple as doing a Cut+Paste though, the code I posted was very generalised and came from a FAQ I keep on my PC. You will still have to learn about Windows Hooks and how they work (and their limitations on capturing certain keystrokes). You'll also have to learn about creating Windows DLL's and how they're structured - I think the OpenFAQ on CodeGuru has an Article, if not, I'm sure I've got one lying around somewhere. - expect a LOT of crashes, especially where Windows Hooks are involved. Regards Chris Eastwood CodeGuru - the website for developers http://www.codeguru.com/vb Crazy D April 17th, 1999, 08:29 AM Hi If you want that something happens in your program if you program doesn't have the focus, you can use a hotkey. (Like the Windowskey + E that will popup explorer, or they keys in ICQ to open the contactlist) It's quite easy, no need for C++. Place this in a module (and replace the Form1 with the formname of your own. Ctrl+F1 will set the caption to "Hotkey" and Ctrl+F2 clears it. Works fine in WinNT 4 SP4 and VB6. Option Explicit Private Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long Private Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal dwLength As Long) Private Const MOD_CONTROL = &H2 Private Const VK_F1 = &H70 Private Const VK_F2 = &H71 Private Const WM_HOTKEY = &H312 Private Const GWL_WNDPROC = (-4) Dim lOldWinProc As Long Public Sub Register() lOldWinProc = SetWindowLong(Form1.hwnd, GWL_WNDPROC, AddressOf SubClass1_WndMessage) Call RegisterHotKey(Form1.hwnd, 0, MOD_CONTROL, VK_F1) Call RegisterHotKey(Form1.hwnd, 1, MOD_CONTROL, VK_F2) End Sub Public Sub Unregister() Call UnregisterHotKey(Form1.hwnd, 0) Call UnregisterHotKey(Form1.hwnd, 1) Call SetWindowLong(Form1.hwnd, GWL_WNDPROC, lOldWinProc) End Sub Public Function SubClass1_WndMessage(ByVal hwnd As Long, ByVal Msg As Long, ByVal wp As Long, ByVal lp As Long) As Long If Msg = WM_HOTKEY Then If HIWORD(lp) = VK_F1 Then Form1.Caption = "HotKey" Else Form1.Caption = "" End If End If SubClass1_WndMessage = CallWindowProc(lOldWinProc, hwnd, Msg, wp, lp) End Function Public Function LOWORD(dwValue As Long) As Integer MoveMemory LOWORD, dwValue, 2 End Function Public Function HIWORD(dwValue As Long) As Integer MoveMemory HIWORD, ByVal VarPtr(dwValue) + 2, 2 End Function Hope this helps Crazy D Dingojoe April 17th, 1999, 08:56 PM Private Const MOD_CONTROL = &H2 Private Const VK_F1 = &H70 Private Const VK_F2 = &H71 Private Const WM_HOTKEY = &H312 what are the &h etc etc for? for me to set numerous hotkeys, what parts do i change? ? codeguru.com
Copyright Internet.com Inc., All Rights Reserved. |