Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отправить сообщение неактивному окну [D6, WinXP]


НовичОк ©   (2004-10-09 01:57:00) 

Как можно отправить сообщение неактивному окну на примере нажатия клавиш?

Procedure PostKeyEx(hWindow: HWnd; key: Word; Const shift: TShiftState; specialkey: Boolean );
Type
 TBuffers = Array [0..1] of TKeyboardState;
Var
 pKeyBuffers : ^TBuffers;
 lparam: LongInt;
Begin
If IsWindow(hWindow) Then
Begin
  pKeyBuffers := Nil;
  lparam := MakeLong(0, MapVirtualKey(key, 0));
  If specialkey Then lparam := lparam or $1000000;
  New(pKeyBuffers);
  try
   AttachThreadInput(GetCurrentThreadId, GetWindowThreadProcessID(hWindow, nil), True);
   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;
   If ssLeft In shift Then pKeyBuffers^[0][VK_LBUTTON] := $80;
   If ssRight In shift Then pKeyBuffers^[0][VK_RBUTTON] := $80;
   If ssMiddle In shift Then pKeyBuffers^[0][VK_MBUTTON] := $80;
   SetKeyboardState( pKeyBuffers^[0] );
   If ssAlt In Shift Then
   Begin
     PostMessage( hWindow, WM_SYSKEYDOWN, key, lparam);
     PostMessage( hWindow, WM_SYSKEYUP, key, lparam or $C0000000);
   End
   Else Begin
     PostMessage( hWindow, WM_KEYDOWN, key, lparam);
     PostMessage( hWindow, WM_KEYUP, key, lparam or $C0000000);
   End;
   Application.ProcessMessages;
   Sleep(100);
   SetKeyboardState( pKeyBuffers^[1] );
   AttachThreadInput(GetCurrentThreadId, GetWindowThreadProcessID(hWindow, nil), False);
  finally
    If pKeyBuffers <> Nil Then Dispose( pKeyBuffers );
  End;
End;
End;

procedure TMainForm.Button1Click(Sender: TObject);
begin
 PostKeyEx(findwindow(nil,pchar(prog)), vk_f4, [ssalt], False );
end;


BillyJeans   (2004-10-09 13:32:00) [1]

при отправке сообщения окну нет разницы активно оно или нет...


Наверх

Титульная страница Поиск, карта сайта Написать письмо