Ну, блин, не думал, что такой гемор будет с отправкой кнопочек клиенту. Причем пока всякие циферки и Ф-ки отправлял - все отлично было. А вот захотелось мне сделать процедуру экстренного свала из под огня. Ну, говорю, клиент . Жмакни мне тильдочку. А он мне в ответ - ты чо - сдурел шоли? Я тебе чо - текстовый редактор тильдочки жмакать? И вот тут у танка отвалилась башня. То нажимает, то не нажимает, то язык ему не тот. и т.д. и т.п. Короче проимелся я более 10 часов...
Вот вам результат... Может кому полезно будет...
Code:
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ~~~ procedures to send key pressing to client
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
procedure TaPWT.SendKey(aWindowHandle: HWND; aPWThreadID: Cardinal; Key: Word; const Shift: TShiftState; SpecialKey, EngLayout: Boolean);
type
TBuffers = array [0..1] of TKeyboardState;
var
pKeyBuffers: ^TBuffers;
lParam: LongInt;
Layout, tLayout: Cardinal;
i: integer;
begin
if EngLayout then
begin
Layout := LoWord(GetKeyboardLayout(aPWThreadID));
PostMessage(aWindowHandle, WM_INPUTLANGCHANGEREQUEST, 0, $00000409);
end;
Sleep(20);
AttachThreadInput(aPWThreadID, GetCurrentThreadId, true);
sleep(20);
pKeyBuffers := nil;
lParam := MakeLong(0, MapVirtualKey(Key, 0));
if SpecialKey then
lParam := lParam or $1000000;
New(pKeyBuffers);
try
GetKeyboardState(pKeyBuffers^[1]);
FillChar(pKeyBuffers^[0], SizeOf(TKeyboardState), 0);
if ssShift in Shift then
pKeyBuffers^[0][VK_SHIFT] := $80;
if ssAlt in Shift then
begin
pKeyBuffers^[0][VK_MENU] := $80;
lParam := lParam or $20000000;
end;
if ssCtrl in Shift then
pKeyBuffers^[0][VK_CONTROL] := $80;
SetKeyboardState(pKeyBuffers^[0]);
if ssAlt in Shift then
begin
PostMessage(aWindowHandle, WM_SYSKEYDOWN, Key, lParam);
PostMessage(aWindowHandle, WM_SYSKEYUP, Key, lParam or $C0000000);
end
else
begin
PostMessage(aWindowHandle, WM_KEYDOWN, Key, lParam);
PostMessage(aWindowHandle, WM_KEYUP, Key, lParam or $C0000000);
end;
sleep(50);
Application.ProcessMessages;
SetKeyboardState(pKeyBuffers^[1]);
finally
if pKeyBuffers <> nil then
Dispose(pKeyBuffers);
end;
AttachThreadInput(aPWThreadID, GetCurrentThreadId, false);
sleep(20);
if EngLayout then
for I := 1 to 10 do
if Layout <> LoWord(GetKeyboardLayout(aPWThreadID)) then
begin
PostMessage(aWindowHandle, WM_INPUTLANGCHANGEREQUEST, 0, Layout);
Sleep(20);
end
else
break;
end;
procedure TCharForm.Button5Click(Sender: TObject);
begin
aPWT.SendKey(aPWWindow.aWindowHandle, aPWWindow.aThreadId, VK_ESCAPE, [], false, true);
aPWT.SendKey(aPWWindow.aWindowHandle, aPWWindow.aThreadId, VkKeyScan('~'), [ssShift], false, true);
aPWT.SendKey(aPWWindow.aWindowHandle, aPWWindow.aThreadId, VK_DOWN, [], false, true);
aPWT.TextToClipboard('exit');
aPWT.SendKey(aPWWindow.aWindowHandle, aPWWindow.aThreadId, VkKeyScan('v'), [ssCtrl], false, true);
aPWT.SendKey(aPWWindow.aWindowHandle, aPWWindow.aThreadId, VK_RETURN, [], false, true);
end;