就差一点了,软键盘制问题,请求高手相助,在线等待!!!200分(200分)

D

djrj

Unregistered / Unconfirmed
GUEST, unregistred user!
键盘我做成是独立的。
键盘还是不能完全用,我实在搞不知到底怎么回事?
在记事本,word等delphi等里可以正常使用,
在微软的IE里也可以用(但地址栏无法完全输入)
在我自制的浏览器(WebBrowser)里我试了一下却没反应,
(当我把浏览器的地址输入框改为edit控件是则我的浏览器也能进行
地址输入,但浏览器页面上的输入框却无法输入,而微软浏览器页面上的输入框就可以输入。)

{*以下为程序的源代码*}
unit FrmKeyboard;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, te_controls, ksthemebuttons, ksthemeengine, ksthemeforms,
StdCtrls;

type
TForm1 = class(TForm)
bttnQ: TTeThemeButton;
bttnW: TTeThemeButton;
bttnE: TTeThemeButton;
bttnR: TTeThemeButton;
bttnTab: TTeThemeButton;
bttnO: TTeThemeButton;
bttnP: TTeThemeButton;
bttnCapslock: TTeThemeButton;
TeThemeButton11: TTeThemeButton;
bttnT: TTeThemeButton;
bttnI: TTeThemeButton;
bttnY: TTeThemeButton;
bttnU: TTeThemeButton;
ttemKey: TTeThemeEngine;
bttnS: TTeThemeButton;
bttnD: TTeThemeButton;
bttnF: TTeThemeButton;
bttnG: TTeThemeButton;
bttnA: TTeThemeButton;
TeThemeButton21: TTeThemeButton;
TeThemeButton22: TTeThemeButton;
bttnH: TTeThemeButton;
bttnL: TTeThemeButton;
bttnJ: TTeThemeButton;
bttnK: TTeThemeButton;
bttnShiftL: TTeThemeButton;
bttnX: TTeThemeButton;
bttnC: TTeThemeButton;
bttnV: TTeThemeButton;
bttnB: TTeThemeButton;
bttnZ: TTeThemeButton;
TeThemeButton33: TTeThemeButton;
bttnN: TTeThemeButton;
TeThemeButton36: TTeThemeButton;
bttnM: TTeThemeButton;
TeThemeButton38: TTeThemeButton;
bttnCtrlL: TTeThemeButton;
bttnAltF: TTeThemeButton;
bttnBlank: TTeThemeButton;
bttnWinL: TTeThemeButton;
bttnWinR: TTeThemeButton;
bttnAltR: TTeThemeButton;
TeThemeButton9: TTeThemeButton;
bttnShiftR: TTeThemeButton;
bttnDocR: TTeThemeButton;
bttnCtrlR: TTeThemeButton;
TeThemeForm1: TTeThemeForm;
TeThemeButton45: TTeThemeButton;
bttn1: TTeThemeButton;
bttn2: TTeThemeButton;
bttn3: TTeThemeButton;
bttn4: TTeThemeButton;
TeThemeButton51: TTeThemeButton;
bttn9: TTeThemeButton;
bttn0: TTeThemeButton;
TeThemeButton54: TTeThemeButton;
bttn5: TTeThemeButton;
bttn8: TTeThemeButton;
bttn6: TTeThemeButton;
bttn7: TTeThemeButton;
TeThemeButton59: TTeThemeButton;
TeThemeButton60: TTeThemeButton;
TeThemeButton61: TTeThemeButton;
TeThemeButton1: TTeThemeButton;
procedure bttnAClick(Sender: TObject);//模拟键盘
procedure FormCreate(Sender: TObject);//创建窗口
procedure myWM_ACTIVATE(var Message: TMessage); message WM_ACTIVATE;//截获消息
private
{ Private declarations }
public
{ Public declarations }
end;
TStateMeal= (Ctrl,Alt,Shift);//定义一个集合
TStateArray= array[Ctrl..Shift] of Boolean;//定义一个数组(数组下标为集合类型)

var
Form1: TForm1;
StateArray: TStateArray;
HActWin,Hself:Longint;

implementation

{$R *.dfm}

{***********************************************************}
{* 模拟键盘 *}
{***********************************************************}
{* 功能:模拟键盘 *}
{* 说明:1.按纽的Tag属性存放相应键的虚拟键值(十进制) *}
{* 2.根据相应的按纽传递其Tag值,(即虚拟键值键值) *}
{* 3.程序以case语句为主,便于判断与理解 *}
{* 4.所有按纽的OnClick事件均为按纽"A"的OnClick事件 *}
{*=========================================================*}
procedure TForm1.bttnAClick(Sender: TObject);
var
focushld,windowhld:hwnd;
threadld:dword;
Key: integer;
begin

//焦点定位,以便接受键盘输入
SetActiveWindow(HActWin);
windowhld:=GetForegroundWindow;
threadld:=GetWindowThreadProcessId(Windowhld,nil); //Windowhld
AttachThreadInput(GetCurrentThreadId,threadld,true);
Focushld:=getfocus;
AttachThreadInput(GetCurrentThreadId,threadld,false);
if focushld = 0 then Exit;

//开始模拟键盘
Key:= (Sender as TTeThemeButton).Tag;
case Key of
//双字符键的模拟
48..57,65..90,111,188..190,186,187,220,221,222,219 :
begin
keybd_event(key,MapVirtualKey(key,0),KEYEVENTF_KEYUP,0);//释放键
keybd_event(key,MapVirtualKey(key,0),0,0);//按下键
//释放控制键
if StateArray[Ctrl] then keybd_event(17,MapVirtualKey(17,0),KEYEVENTF_KEYUP,0);
if StateArray[Alt] then keybd_event(18,MapVirtualKey(18,0),KEYEVENTF_KEYUP,0);
if StateArray[Shift]then keybd_event(16,MapVirtualKey(16,0),KEYEVENTF_KEYUP,0);
end;

//按制键的模拟(Shift,Ctrl,Alt)
16 :
begin
keybd_event(key,MapVirtualKey(key,0),0,0);//按下键
StateArray[Shift]:=true;
end;
17 :
begin
keybd_event(key,MapVirtualKey(key,0),0,0);//按下键
StateArray[Ctrl]:=true;
end;
18 :
begin
keybd_event(key,MapVirtualKey(key,0),0,0);//按下键
StateArray[Alt]:=true;
end;

//Tab键的模拟{这里考虑到了Alt+Tab的模拟}
9 :
begin
keybd_event(key,MapVirtualKey(key,0),0,0);//按下键
keybd_event(key,MapVirtualKey(key,0),0,0);//释放键
if StateArray[Shift] then {考虑Alt+Tab的模拟}
keybd_event(18,MapVirtualKey(18,0),0,0);//释放键
end

//其它键的模拟{简单的按下然后释放}
else
begin
keybd_event(key,MapVirtualKey(key,0),0,0);//按下键
keybd_event(key,MapVirtualKey(key,0),KEYEVENTF_KEYUP,0);//释放键
end;
end;
end;

{***********************************************************}
{* 截获 WM_ACTIVATE 消息 *}
{***********************************************************}
{* 功能:获得输入句柄 *}
{* 日期:2002年11月20日 *}
{* 作者: *}
{*=========================================================*}
procedure TForm1.myWM_ACTIVATE(var Message: TMessage);
begin
if Message.wParam = WA_CLICKACTIVE then
begin
//SetActiveWindow(message.lParam);
if (HActWin<>message.lParam) and (message.lParam<>Hself) then
HActWin:=message.lParam;
end;
end;

{***********************************************************}
{* 程序初始化 *}
{***********************************************************}
{* 功能:数组变量赋初值false *}
{* 日期:2002年11月20日 *}
{* 作者: *}
{*=========================================================*}
procedure TForm1.FormCreate(Sender: TObject);
begin
StateArray[Ctrl]:= false;
StateArray[Alt]:= false;
StateArray[Shift]:= false;
end;

end.
 
会不会和焦点有关?
 
UP!
高手何在,200块大洋不值钱了?
 
我要是知道就好了!
补充:软盘只用来简单输入字母数字,
 
可否把你的程序上传到www.playicq.com,大家试一下,不然可能找不出问题。
 
TO:yanghai0437,谢谢你
TO:zw84611,好的,我马上就传,
凡是UP者都有分,
我会另加100分,用来分给帮忙UP的热心人
 
少控件:TTeThemeButton;
 
我在delphi里面装了TTeThemeButton控件啊,
 
D6有?我的是D5 :(
 
我用记事本把TTeThemeButton都换成SpeedButton了,
虽然有几个错,但忽略后还是可以运行。:)

我发现你的HActWin的值始终为0
 
怪异,我发现所有的Combobox都有这个问题,不光是IE!
 
谢谢zw84611,请大家继续讨论!
 
这个VC程序http://www.vchelp.net/vchelp/zsrc/screen_keyboard_src.zip和你的程序问题一样。
可以将keybd_event()改成SendMessage(hwnd,WM_CHAR,Ord(char),1);试试
 
我改了,也一样啊
 
没人能觖决这个问题么?很急啊!
 
关注ing...
 
这段程序好有风格,注释清晰,语句流畅!!!!
可惜~~~~偶看不出有什么不对··
可能输入框的属性你弄错了
 
难道真的没人能觖?还是分数太少?
左轻候、温柔一刀……你们都是高人啊,看到这个贴子后能否帮帮小弟一把。
小弟在下有请了,我知道你们一定能解决的。
 
没时间研究呀,[:(]
 
顶部