Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.167 Beiträge
 
Delphi 12 Athens
 
#9

Re: Probleme mit Sendkey nach Umstieg auf Win764Bit

  Alt 3. Mär 2010, 14:28
versuch es mal so
Delphi-Quellcode:
procedure SendKeyEx(hWindow: HWnd; key: Word;
  const shift: TShiftState; specialkey: Boolean);
{************************************************************
* Procedure SendKeyEx
*
* Parameters:
*  hWindow: target window to be send the keystroke
*  key    : virtual keycode of the key to send. For printable
*          keys this is simply the ANSI code (Ord(character)).
*  shift  : state of the modifier keys. This is a set, so you
*          can set several of these keys (shift, control, alt,
*          mouse buttons) in tandem. The TShiftState type is
*          declared in the Classes Unit.
*  specialkey: normally this should be False. Set it to True to
*          specify a key on the numeric keypad, for example.
*          If this parameter is true, bit 24 of the lparam for
*          the posted WM_KEY* messages will be set.
* Description:
*  This procedure sets up Windows key state array to correctly
*  reflect the requested pattern of modifier keys and then posts
*  a WM_KEYDOWN/WM_KEYUP message pair to the target window. Then
*  Application.ProcessMessages is called to process the messages
*  before the keyboard state is restored.
* Error Conditions:
*  May fail due to lack of memory for the two key state buffers.
*  Will raise an exception in this case.
* NOTE:
*  Setting the keyboard state will not work across applications
*  running in different memory spaces on Win32 unless AttachThreadInput
*  is used to connect to the target thread first.
*Created: 02/21/96 16:39:00 by P. Below
************************************************************}

type
  TBuffers = array [0..1] of TKeyboardState;
var
  pKeyBuffers: ^TBuffers;
  lParam: LongInt;
begin
  (* check if the target window exists *)
  if IsWindow(hWindow) then
  begin
    (* set local variables to default values *)
    pKeyBuffers := nil;
    lParam := MakeLong(0, MapVirtualKey(key, 0));

    (* modify lparam if special key requested *)
    if specialkey then
      lParam := lParam or $1000000;

    (* allocate space for the key state buffers *)
    New(pKeyBuffers);
    try
      (* Fill buffer 1 with current state so we can later restore it.
         Null out buffer 0 to get a "no key pressed" state. *)

      GetKeyboardState(pKeyBuffers^[1]);
      FillChar(pKeyBuffers^[0], SizeOf(TKeyboardState), 0);

      (* set the requested modifier keys to "down" state in the buffer*)
      if ssShift in shift then
        pKeyBuffers^[0][VK_SHIFT] := $80;
      if ssAlt in shift then
      begin
        (* Alt needs special treatment since a bit in lparam needs also be set *)
        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;

      (* make out new key state array the active key state map *)
      SetKeyboardState(pKeyBuffers^[0]);
      (* post the key messages *)
      if ssAlt in Shift then
      begin
        if not PostMessage(hWindow, WM_SYSKEYDOWN, key, lParam)
            or not PostMessage(hWindow, WM_SYSKEYUP, key, lParam or $C0000000) then
          raise Exception.Create(SysErrorMessage(GetLastError));
      end
      else
      begin
        if not PostMessage(hWindow, WM_KEYDOWN, key, lParam)
            or not PostMessage(hWindow, WM_KEYUP, key, lParam or $C0000000) then
          raise Exception.Create(SysErrorMessage(GetLastError));
      end;

      (* restore the old key state map *)
      SetKeyboardState(pKeyBuffers^[1]);
    finally
      (* free the memory for the key state buffers *)
      Dispose(pKeyBuffers);
    end; { If }
  end;
end; { PostKeyEx }
Es wird nicht umsonst ständig gesagt, daß man gefälligst mal die Rückgabewerte prüfen soll ... vorallem wenn etwas nicht geht und man weiß nicht warum.

Wobei man es auch mal über SendMessage/SendMessageTimeout anstatt über PostMessage versuchen könnte,
dann würde man auch noch den Rückgabewert des Programms erfahren.


MSDN: PostMessage
Microsoft Windows Vista and later. Message posting is subject to User Interface Privilege Isolation (UIPI). The thread of a process can post messages only to message queues of threads in processes of lesser or equal integrity level.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat