用串口输入模拟键盘输入,和键盘状态的设置。非常急,各位帮忙。(150分)

  • 主题发起人 主题发起人 vbxu
  • 开始时间 开始时间
V

vbxu

Unregistered / Unconfirmed
GUEST, unregistred user!
1、我在串口上装了个红外接受器,现在的问题是我要把从串口输入的命令变成
我需要的击键,也就是希望对应用程序来说就是一正常的键盘输入,请问如何
办。
2、我需要替换小键盘锁“num lock”的功能要让它按了后状态不会变化,始终
保持在小键盘打开的状态,而且还要处理我需要的功能。
 
各位老兄怎么都不说话,就是安慰安慰我也是好的。第二个问题我已经搞定了,但还
是有点小bug,好象时间一长num lock的状态就会变掉,虽然得到的键盘信息还是1
但num lock灯却灭了而且功能也是小键盘关的状态。现在有个另外的问题是我要替
换我的输入,就是比如我按向右,但我要程序收到的是向上,我用postmessage得到
的结果是先向右,再向上,如何不让系统右就向上?
 
1.打开一个名为"COM1"的文件
用线程或TTimer取其内容

2.拆掉 num lock 按钮下的开关(真笨!)
 
系统竟然没有发信告诉我终于有人回答我的问题了,我感动得是热泪盈眶啊!
可惜你对问题的回答不太贴题。
对第一个:我要使com的输入对程序是透明的,也就是程序以为就是键盘输入。
对第二个:拆了确实是个好办法,可是我要用它当一个输入键用的。
第二个问题我搞定了,第一个到底如何搞定,各位给个思路也好,帮忙啊
 
用发出键盘的按键信息
PostMessage(需要输入的Handle你自己抓或者是程序传递给你的过程,WM_KEYDOWN,wParam,0)
wParam是键盘扫描码,你可以自己写个程序看看:)
 
试试API函数吧:
keybd_event(Key, KEYEVENTF_KEYUP, 0, 0)

Key是你要模拟的按键的....虚拟键码.(*^v^*)

这个函数是这样声明的:
VOID keybd_event(
BYTE bVk, // virtual-key code
BYTE bScan, // hardware scan code
DWORD dwFlags, // flags specifying various function options
DWORD dwExtraInfo // additional data associated with keystroke
);

自己试试吧! 使过了告诉我一声啊!
 
我看keybd_event和postmessage没什么大区别,还是要在程序里动手脚,难道我要写个驱动程序?对了谁能告诉我如何把按键消息截取并换掉里面的键值。我就给分了
 
  你的确需要做一个驱动,就象串口游戏操纵杆那样。
  否则你要有个应用程序始终监视某个串口,把命令
转义为键盘SendMessage或PostMessage发送给当前Active的窗口或应用。
 
用HOOK截获和替换键盘值
unit HKProc;

interface

uses
Windows, Messages,SysUtils;

var
hNextHookProc: HHook;
procSaveExit: Pointer;

function KeyboardHookHandler(iCode: Integer;
wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall; export;


function LowLevelKeyboardFilterProc(iCode: Integer;
wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall; export;
function EnableHotKeyHook: BOOL; export;
function DisableHotKeyHook: BOOL; export;
procedure HotKeyHookExit; far;

implementation
function LowLevelKeyboardFilterProc(iCode: Integer;
wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall; export;

begin
end;
function KeyboardHookHandler(iCode: Integer;
wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall; export;
const
_KeyPressMask = $80000000;
begin
Result := 0;
If iCode < 0 Then
begin
Result := CallNextHookEx(hNextHookProc, iCode, wParam, lParam);
Exit;
end;

if ((lParam and _KeyPressMask) = 1) and
(wParam = VK_MENU) then
begin
wParam = VK_F1; // ALT键替换为F1
end;
Result := CallNextHookEx(hNextHookProc, iCode, wParam, lParam);
end;

function EnableHotKeyHook: BOOL; export;
begin
Result := False;
if hNextHookProc <> 0 then Exit;
// 挂上 WH_KEYBOARD 这型的 HOOK, 同时, 传回值必须保留下
// 来, 免得 HOOK 呼叫链结断掉
hNextHookProc := SetWindowsHookEx(WH_KEYBOARD,
KeyboardHookHandler,
HInstance,
0);
Result := hNextHookProc <> 0;
end;

function DisableHotKeyHook: BOOL; export;
begin
if hNextHookProc <> 0 then
begin
UnhookWindowshookEx(hNextHookProc); // 解除 Keyboard Hook
hNextHookProc := 0;
MessageBeep(0);
MessageBeep(0);
end;
Result := hNextHookProc = 0;
end;

procedure HotKeyHookExit;
begin
// 如果忘了解除 HOOK, 自动代理解除的动作
if hNextHookProc <> 0 then DisableHotKeyHook;
ExitProc := procSaveExit;
end;

end.
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
676
import
I
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部