Fonte: www.activedelphi.com.br
Essa dica explicando como enviar, ou pelo menos simular o envio, de certa mensagem a um aplicativo externo, como o MSN Messenger, ou qualquer outra aplicação que você gostaria que seu software comunicasse.
Alguns aplicativos são protegidos para não receber mensagens externas, e a maneira mais fácil de "burlar" essa proteção é fazendo com que o software imagine que o usuário que esta fazendo certo procedimento.
Então criaremos a seguinte função :
procedure ProcKey(K: Char);
var
C: Char;
const
ShiftKeys: array[1..18] of String = ('!',\@\, '#', '$', '%', '&', '*', '(', ')','_', '+', '{', '}', '|', '<', '>', ':', '?');
SKValues: array[1..18] of Char = ('1', '2', '3', '4', '5', '7', '8', '9', '0','-', '=', '[', ']', '\', ',', '.', ';', '/');
function SK: Boolean;
var X: Integer;
begin
Result := True;
for X := 1 to 18 do if ShiftKeys[X] = K then
begin
C := SKValues[X];
exit;
end;
Result := False;
end;
begin
if (K in ['a'..'z', '0'..'9', #32, '.', ',']) then keybd_event(VkKeyScan(UpCase(K)), 0, 0, 0)
else if (K in ['A'..'Z']) then
begin
{ Pressiona o shift }
keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY or 0, 0);
{ Tecla a letra }
keybd_event(VkKeyScan(UpCase(K)), 0, 0, 0);
{ Solta o shift }
keybd_event(VK_SHIFT, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end
else if SK then
begin
{ Pressiona o shift }
keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY or 0, 0);
{ Tecla a letra }
keybd_event(VkKeyScan(C), 0, 0, 0);
{ Solta o shift }
keybd_event(VK_SHIFT, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end;
end;
Esta função fica responsável pela simulação do pressionamento de alguma tecla, fazendo com que o controle ativo receba tal caractere.
Para podermos digitar toda uma frase é só fazer um loop ... Por exemplo, temos uma constante Texto com o valor 'Artigo para aprendizado', e gostaríamos de que quando o usuário estiver visualizado uma janela que possua tal palavra em seu título, ele digite essa mensagem e tecle enter, no caso do MSN para que ela seja enviada, faríamos da seguinte maneira :
var Texto : string;
x: integer;
begin
Texto := edit1.Text;
while True do
begin
if GetForegroundWindow = FindWindow(nil, '(co) Mauro (co)') then
begin
for X := 1 to Length(Texto) do ProcKey(Texto[X]);
keybd_event(13, 0, 0, 0);
end;
Application.ProcessMessages;
end;
end;
A rotina acima faz um loop na constante Texto ... quando a janela ativa for a janela que tiver o titulo igual a (co) Mauro (co), digitando os caracteres e mandando a mensagem com o pressionamento do enter.
Alguns aplicativos são protegidos para não receber mensagens externas, e a maneira mais fácil de "burlar" essa proteção é fazendo com que o software imagine que o usuário que esta fazendo certo procedimento.
Então criaremos a seguinte função :
procedure ProcKey(K: Char);
var
C: Char;
const
ShiftKeys: array[1..18] of String = ('!',\@\, '#', '$', '%', '&', '*', '(', ')','_', '+', '{', '}', '|', '<', '>', ':', '?');
SKValues: array[1..18] of Char = ('1', '2', '3', '4', '5', '7', '8', '9', '0','-', '=', '[', ']', '\', ',', '.', ';', '/');
function SK: Boolean;
var X: Integer;
begin
Result := True;
for X := 1 to 18 do if ShiftKeys[X] = K then
begin
C := SKValues[X];
exit;
end;
Result := False;
end;
begin
if (K in ['a'..'z', '0'..'9', #32, '.', ',']) then keybd_event(VkKeyScan(UpCase(K)), 0, 0, 0)
else if (K in ['A'..'Z']) then
begin
{ Pressiona o shift }
keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY or 0, 0);
{ Tecla a letra }
keybd_event(VkKeyScan(UpCase(K)), 0, 0, 0);
{ Solta o shift }
keybd_event(VK_SHIFT, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end
else if SK then
begin
{ Pressiona o shift }
keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY or 0, 0);
{ Tecla a letra }
keybd_event(VkKeyScan(C), 0, 0, 0);
{ Solta o shift }
keybd_event(VK_SHIFT, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end;
end;
Esta função fica responsável pela simulação do pressionamento de alguma tecla, fazendo com que o controle ativo receba tal caractere.
Para podermos digitar toda uma frase é só fazer um loop ... Por exemplo, temos uma constante Texto com o valor 'Artigo para aprendizado', e gostaríamos de que quando o usuário estiver visualizado uma janela que possua tal palavra em seu título, ele digite essa mensagem e tecle enter, no caso do MSN para que ela seja enviada, faríamos da seguinte maneira :
var Texto : string;
x: integer;
begin
Texto := edit1.Text;
while True do
begin
if GetForegroundWindow = FindWindow(nil, '(co) Mauro (co)') then
begin
for X := 1 to Length(Texto) do ProcKey(Texto[X]);
keybd_event(13, 0, 0, 0);
end;
Application.ProcessMessages;
end;
end;
A rotina acima faz um loop na constante Texto ... quando a janela ativa for a janela que tiver o titulo igual a (co) Mauro (co), digitando os caracteres e mandando a mensagem com o pressionamento do enter.
Nenhum comentário:
Postar um comentário