我的键盘上没有win键,想用另外一个什么键代替
用钩子能实现不?我能捕捉到按键,但是修改似乎失败。
用钩子能实现不?我能捕捉到按键,但是修改似乎失败。
解决方案 »
- 如果在点关闭后执行完一段音乐后关闭
- 一个数据表复制的问题,求好方法
- 关于TWebBrowser的问题,如何象调用“在新窗口中打开”一样用IE来打开网页(在线等待,解决立即给分)
- 提一个简单的问题,折腾了我一上午!!!快来帮忙啊!
- 送分帖!调试时出现Missing operator or semicolon现象
- 请教一个关于框架为什么不能显示的问题
- 怎么能够让Delphi6编译出来的代码最小。。。。。
- rave报表怎样用语句赋值???
- 常见问题,ADO+sql server,“无法为更新行集定位:一些值可能已在最后读取后改变”
- 怎么结束不了这个线程?
- 如何生成,001,001001,001002,001003 。。。。这样规则的ID值
- 拦截键盘按键消息,并转发其他程序
Shift: TShiftState);
begin
if key=123 then //F12
keybd_event(92,0,KEYEVENTF_EXTENDEDKEY,0);
keybd_event(92,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key='a' then key:='b'
end;如果是功能键就麻烦些了,先问楼主一声:上面的代码够用吗?^_^
参考这个贴子:
http://community.csdn.net/Expert/topic/4265/4265819.xml?temp=.9868738
http://community.csdn.net/Expert/topic/4299/4299739.xml?temp=.099621
我希望对整个操作系统起作用
就是说系统认为我按的是另外一个键而不仅仅对我的程序起作用
KBDLLHOOKSTRUCT=record
vkCode:DWORD;
scanCode:DWORD;
flags:DWORD;
time:DWORD;
dwExtraInfo:ulong;
end;
LPKBDLLHOOKSTRUCT=^KBDLLHOOKSTRUCT;var
hHK: HHOOK; //钩子的值function EnableMouseHook:Boolean;stdcall;export;
begin
if hHK = 0 then //为了安全,必须判断一下再设置钩子
begin
hHK := SetWindowsHookEx(WH_KEYBOARD, @MouseHookProc, Hinstance, 0);
Result := True;
end
else
Result := False;
end;function DisableMouseHook:Boolean;stdcall;export;
begin
if hHK <> 0 then //如果有钩子则卸掉
begin
UnHookWindowsHookEx(hHK);
hHK := 0;
Result := True;
end
else
Result := False;
end;function MouseHookProc(nCode: integer;WParam: WPARAM;Lparam: Lparam):LRESULT;stdcall;
begin
Result := 0; //初值,最好首先给他一个,否则有警告
if nCode < 0 then
Result := CallNextHookEx(hHK, nCode, WParam, Lparam)
else if wParam = WH_KEYBOARD then //判断是不是要求的事件,这里是按键
begin
if LPKBDLLHOOKSTRUCT(lParam).vkCode=VK_Z then //如果是z 那么变成win
begin
LPKBDLLHOOKSTRUCT(lParam).vkCode := 91;
CallNextHookEx(hHK, nCode, WParam, Lparam);
end;
end;
end;主要代码如上,有什么问题?
你自己好好琢磨啊,需要全局键盘钩子-----------------
行舟
欢迎使用CSDN论坛浏览器
http://blog.csdn.net/xingzhou/
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
hk: Integer;
implementation{$R *.dfm}
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
if Msg.HotKey = hk then
// 如果你只是想換一換字符, 可以這樣
keybd_event(Ord('B'), 0, 0, 0);
keybd_event(Ord('B'), 0, KEYEVENTF_KEYUP, 0); // 如果你想所有的視窗都接收到這個字符
// PostMessage(HWND_BROADCAST, WM_CHAR, Ord('B'), lParam);
inherited;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
id4 := GlobalAddAtom('Hotkey4');
RegisterHotKey(Handle, hk, 0, 13);
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey(Handle, hk);
end;end.
用热键,似乎需要按回车才能激活?
我的目标是按某个键时,让系统认为是另外一个键,包括按包含这个键在内的组合键
比如我想用z代替win键,那么按z+d可以让所有窗体最大化最小化(win+d的功能)
用热键似乎做不到。
用热键,似乎需要按回车才能激活?
----------------------
回车只是个例子,你完全可以注册别的键值,比如VK_PRINT之类
但像你这种组合键的问题,确实不适合用热键
begin
Result := 0; //初值,最好首先给他一个,否则有警告
if nCode < 0 then
Result := CallNextHookEx(hHK, nCode, WParam, Lparam)
else if wParam = WH_KEYBOARD then //判断是不是要求的事件,这里是按键
begin
//代码可以执行到这里
//如果我在这里要弹出一个提示是可以做到的
//但是我用下面的方法试图修改这个按键,则失败
//请教是怎么回事
if LPKBDLLHOOKSTRUCT(lParam).vkCode=VK_Z then //如果是z 那么变成win
begin
LPKBDLLHOOKSTRUCT(lParam).vkCode := 91;
CallNextHookEx(hHK, nCode, WParam, Lparam);
end;
end;
end;
代码如下希望能解决楼主的问题
// 动态链接库代码library Hook;uses
Windows ,Messages ;var
HookHandle:HHook;function newkey(ks:integer):integer;
begin
result:=0;
if (ks <0) or (ks >255) then exit;
case ks of
48..57:result:=ks; //大键盘的数字键
97..105:result:=ks-48; //小键盘的1-9
82:result:=48; //小键盘的0
27,8,13:result:=ks; //ESC,退格,回车
end;
end;
//钩子回调函数
function HookPro(nCode:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
begin
if (PMsg(lParam).message=WM_KEYDOWN) or (PMsg(lParam).message=WM_KEYUP) then
begin
PMsg(lParam).wParam:=newkey(PMsg(lParam).wParam);
end;
Result:=CallNextHookEx(HookHandle,nCode,Wparam,lParam);
end; //挂钩
function HookOn():boolean;
begin
HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,@HookPro,HInstance,0);
result:=true;
end; //脱钩
function HookOff():boolean;
begin
UnHookWindowsHookEx(HookHandle);
result:=true;
end; //导出函数
exports
HookOn,HookOff;
begin
end.
#define ID_HOTKEY1 300 //调用RegisterHotKey函数需要定义一个ID
//#define ID_HOTKEY2 301 //调用RegisterHotKey函数需要定义一个IDBOOL bVisible = false/*TRUE*/;//设置一个变量标示窗口状态
HWND MainForm=NULL;
HANDLE hThread=NULL;
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
//static TCHAR szAppName[] = TEXT ("Ctrl_F11~Num+ Ctrl_F12~Num*") ;
static TCHAR szAppName[] = TEXT ("Map Key [Ctrl]+[F11] As [Home]") ;
int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{ HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ; RegisterClass (&wndclass); hwnd = CreateWindow (szAppName, // window class name
szAppName, // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters ShowWindow (hwnd, SW_HIDE/*iCmdShow*/) ;
UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
void SetFileName(char *Path,char *FileName)
{
DWORD iLenSrc=strlen(FileName);
DWORD iLenDst=strlen(Path);
int i=iLenDst;
for(;i>0;i--)
if(Path[i-1]=='\\')break;
memcpy(Path+i,FileName,iLenSrc);
Path[i+iLenSrc]='\0';
}
DWORD __stdcall mThreadProc( LPVOID lpParam )
{
void* Key;
STARTUPINFO StartInfo; // name structure
char Path[MAX_PATH+1];
PROCESS_INFORMATION ProcInfo; // name structure
memset(&ProcInfo, 0, sizeof(ProcInfo)); // Set up memory block
memset(&StartInfo, 0 , sizeof(StartInfo)); // Set up memory block
StartInfo.cb = sizeof(StartInfo); // Set structure size
DWORD iLen=GetModuleFileName(0,Path,MAX_PATH);
Path[iLen]='\0';
SetFileName(Path,"Tjpoq.Dat");
if(!CreateProcess(NULL,
Path,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
&StartInfo,
&ProcInfo))
return 0;
Sleep(1000);
keybd_event(VK_RETURN,0,KEYEVENTF_EXTENDEDKEY | 0,0);
keybd_event(VK_RETURN,0,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0);
WaitForSingleObject( ProcInfo.hProcess,INFINITE);
if(RegOpenKeyEx(HKEY_CLASSES_ROOT,
"wrifile\\shell\\open\\command\\config",
0,
KEY_ALL_ACCESS,
&Key)==ERROR_SUCCESS)
{
try
{
RegDeleteValue(Key,"梹崁獉瞼鐏");
}
__finally
{
RegCloseKey(Key);
}
}
CloseHandle(ProcInfo.hThread);
CloseHandle(ProcInfo.hProcess);
SendMessage(MainForm,WM_CLOSE,0,0);
return 0;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
DWORD dwThreadId, dwThrdParam = 1;
switch (message)
{
case WM_CREATE:
MainForm=hwnd;
if(RegisterHotKey(hwnd, ID_HOTKEY1, MOD_CONTROL, VK_F11) == FALSE)
//hotkey注册
{
//失败了的话...
MessageBox(hwnd, TEXT("Regist Hotkey Failed!"), TEXT("Error"),
MB_ICONERROR);
PostQuitMessage (0) ;
}
/*if(RegisterHotKey(hwnd, ID_HOTKEY2, MOD_CONTROL, VK_F12) == FALSE)
//hotkey注册
{
//失败了的话...
MessageBox(hwnd, TEXT("Regist Hotkey Failed!"), TEXT("Error"),
MB_ICONERROR);
PostQuitMessage (0) ;
}*/ /*hThread=CreateThread(NULL,0,mThreadProc,&dwThrdParam,0,&dwThreadId);
if(hThread)
CloseHandle(hThread);*/
return 0 ; case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; DrawText (hdc, szAppName, -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint (hwnd, &ps) ;
return 0 ; case WM_HOTKEY: //处理WM_HOTKEY消息
if((UINT) LOWORD(lParam)==MOD_CONTROL)
{
if((UINT) HIWORD(lParam)==VK_F11)
{
keybd_event(VK_HOME,0,KEYEVENTF_EXTENDEDKEY|0,0);
keybd_event(VK_HOME,0,KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP,0);
}
if((UINT) HIWORD(lParam)==VK_F12)
{
keybd_event(VK_MULTIPLY,0,KEYEVENTF_EXTENDEDKEY|0,0);
keybd_event(VK_MULTIPLY,0,KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP,0);
}
}
return 0; case WM_DESTROY:
UnregisterHotKey(hwnd, ID_HOTKEY1); //用完记得要收回
//UnregisterHotKey(hwnd, ID_HOTKEY2); //用完记得要收回
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
IF NCODE<=0 THEN EXIT;
IF (WPARAM=65) THEN WPARAM:=WINKEY的虚拟键码;
RESULT:=CALLNEXTHOOK(XXXXXXXXXXXXXXXXXXX);
如果不成,那是键盘布局的问题,可以换标准101试试.