VB能建立热键吗?就像ASP那样
请详细回答谢谢 问题点数:30、回复次数:5Top
1 楼MSTOP(陈建华)回复于 2004-04-04 19:46:17 得分 15
可以...
不过,单纯用VB做不了.要用C开发一个类库.
'这是它的源代码.参考一下
'KEYBKOOK.C
#include <windows.h>
#include <windowsx.h>
#include <tchar.h>
HINSTANCE g_hinstDll = NULL;
#pragma data_seg(".drectve")
static char szLinkDirectiveShared[] = "-section:Shared,rws";
#pragma data_seg()
#pragma data_seg("Shared")
HHOOK g_hhook = NULL;
HWND g_hwndPost = NULL;
UINT g_uMsgNotify = WM_USER;
#pragma data_seg()
static LRESULT WINAPI KeyboardHook_HookProc (
int nCode,
WPARAM wParam,
LPARAM lParam)
{
LRESULT lResult = CallNextHookEx(g_hhook, nCode, wParam, lParam);
if (nCode == HC_ACTION)
{
PostMessage(g_hwndPost, g_uMsgNotify, wParam, lParam);
}
return(lResult);
}
BOOL WINAPI SetKeyboardHook (HWND hWndPost, UINT Msg)
{
HHOOK hhook;
if (g_hhook != NULL) return(FALSE);
g_hwndPost = hWndPost;
g_uMsgNotify = Msg;
Sleep(0);
hhook = SetWindowsHookEx(WH_KEYBOARD, KeyboardHook_HookProc, g_hinstDll, 0);
InterlockedExchange((PLONG) &g_hhook, (LONG) hhook);
return(g_hhook != NULL);
}
BOOL WINAPI ReleaseKeyboardHook()
{
BOOL fOK = TRUE;
if (g_hhook != NULL)
{
fOK = UnhookWindowsHookEx(g_hhook);
g_hhook = NULL;
}
return(fOK);
}
BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
g_hinstDll = hinstDll;
break;
}
return(TRUE);
}
'KEYBHOOT.DEF*********************
EXPORTS
SetKeyboardHook
ReleaseKeyboardHookTop
2 楼zhaoshuangly()回复于 2004-04-04 20:05:02 得分 0
用VB可以调用这个类吗?怎么调用啊?谢谢Top
3 楼sakurako(看晨雾散开,你就是我一生的最爱...)回复于 2004-04-04 20:40:58 得分 15
给你写了个程序:)
'====Form1中========
Private Sub Form_Load()
preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WndProc)
idHotKey = 1
uVirtKey = vbKeyN
Modifiers = MOD_CONTROL '=====热键是Ctrl+N,你可以自己改
ret = RegisterHotKey(Me.hwnd, idHotKey, Modifiers, uVirtKey)
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
SetWindowLong Me.hwnd, GWL_WNDPROC, preWinProc
Call UnregisterHotKey(Me.hwnd, uVirtKey)
End Sub
'======Module1中===============
Public 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
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Public Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long
Public Const GWL_WNDPROC = (-4)
Public Const MOD_CONTROL = &H2
Public Const WM_HOTKEY = &H312
Public Type Stru1
p As Long
End Type
Public Type Stru2
lWord As Integer
hWord As Integer
End Type
Public preWinProc As Long
Public Modifiers As Long, uVirtKey As Long, idHotKey As Long
Public Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim ret As Long
If Msg = WM_HOTKEY Then
If wParam = idHotKey Then
Dim lp As Stru1, s As Stru2
lp.p = lParam
LSet s = lp
If (s.lWord = Modifiers) And s.hWord = uVirtKey Then
'执行操作
msgbox "热键程序"
End If
End If
End If
WndProc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
End Function
Top
4 楼sakurako(看晨雾散开,你就是我一生的最爱...)回复于 2004-04-04 20:41:55 得分 0
机器上没有VB无法帮你调试,你自己试试看吧Top
5 楼zhaoshuangly()回复于 2004-04-04 20:47:06 得分 0
好的 谢谢你啊:)我试试Top




