![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вставка апострофа во всех контролах [D6, WinXP]
RDA © (2006-01-17 10:13:00)Как сделать так чтобы в программе во всех контролах при нажатии, к примеру Ctrl+~ результатом вставлялся бы апостроф?
RDA (2006-01-17 14:40:00) [1]Игорь Шевченко
То что доктор приписал. Спасибо.
Игорь Шевченко (2006-01-17 13:51:00) [2]
> Может есть лучше вариант?
unit HookUnit;
interface
procedure SetHook;
procedure RemoveHook;
implementation
uses
Windows, Messages, SysUtils;
var
hGetMsgHook: THandle;
const
VK_OEM_3 = $C0;
function GetMsgProc(Code: Integer; wParam1: Integer;
lParam: Integer): LRESULT; stdcall;
function KeyIsPressed (Key: Integer): Boolean;
begin
Result := GetKeyState(Key) and $80000000 <> 0;
end;
begin
if Code >= 0 then begin
if (PMsg(lParam)^.Message = WM_KEYDOWN) and (wParam1 = PM_REMOVE) then
if (PMsg(lParam)^.wParam = VK_OEM_3) and
KeyIsPressed(VK_CONTROL) then begin
PMsg(lParam)^.message := WM_NULL;
PostMessage(PMsg(lParam)^.hWnd, WM_CHAR, Ord(''''),
PMsg(lParam)^.lParam);
end;
end;
Result := CallNextHookEx(hGetMsgHook, Code, wParam1, lParam);
end;
procedure SetHook;
begin
Assert(hGetMsgHook = 0);
hGetMsgHook := SetWindowsHookEx(WH_GETMESSAGE, @GetMsgProc, 0,
GetCurrentThreadId);
end;
procedure RemoveHook;
begin
Assert(hGetMsgHook <> 0);
UnhookWindowsHookEx(hGetMsgHook);
hGetMsgHook := 0;
end;
end.
И пример использования:
unit main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TfMain = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
end;
var
fMain: TfMain;
implementation
uses
HookUnit, Other;
{$R *.DFM}
procedure TfMain.FormCreate(Sender: TObject);
begin
SetHook;
end;
procedure TfMain.Button1Click(Sender: TObject);
begin
with TfOther.Create (Application) do
try
ShowModal;
finally
Free;
end;
end;
end.
unit Other;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TfOther = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
end;
var
fOther: TfOther;
implementation
{$R *.DFM}
end.
RDA (2006-01-17 12:53:00) [3]Сделать то можно, вот только форм же много, для каждой делать? Может есть лучше вариант?
Leonid Troyanovsky (2006-01-17 12:47:00) [4]
> RDA (17.01.06 11:16) [2]
> у каждого описать OnKeyDown - но можно же как-то єто сделать
> по другому через клавиатурный хук или еще как-то иначе.
Например, сделать Action (ActionList) with OnExecute:
procedure TForm1.Action1Execute(Sender: TObject);
begin
ActiveControl.Perform(WM_CHAR, Ord(''''), 0);
end;
--
Regards, LVT.
medvedenator (2006-01-17 11:22:00) [5]Удалено модератором
Desdechado (2006-01-17 11:18:00) [6]а один обработчик OnKeyDown на всех?
RDA (2006-01-17 11:16:00) [7]Нет, не это имелось ввиду, нужно просто сделать подмену ввода для каждого контрола в отдельности, можно конечно у каждого описать OnKeyDown - но можно же как-то єто сделать по другому через клавиатурный хук или еще как-то иначе. Подскажите решение.
TUser (2006-01-17 10:16:00) [8]Перебрать в цикле все Components