Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Taste senden/DCOM (https://www.delphipraxis.net/168649-taste-senden-dcom.html)

golisan 1. Jun 2012 19:15

Taste senden/DCOM
 
Hallo Forum,

mal wieder ein "Taste senden"-Thema...

Ja aber mit einer Besonderheit: mein Programm läuft als DCOM-Server.

Laufen soll folgender Code:

Delphi-Quellcode:
 SetForegroundWindow(wnd);
  Sleep(100);
Keybd_Event(VK_CONTROL,0,0,0);
Keybd_Event(byte('G'),0,0,0);
Keybd_Event(byte('G'),0,KEYEVENTF_KEYUP,0);
Keybd_Event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
Das Handle wnd ist korrekt ermittelt und ist <> 0.
Die Ermittlung des Handles geschieht mit
Delphi-Quellcode:
wnd := FindWindow('NIDEWindowClass', 'Natural 6.2 ');
wnd := FindWindowEx(wnd, 0, 'MDIClient', nil);
.
.
Binde ich den Code in eine normale Formularanwendung ein tut alles wie es soll: STRG-G wird an die Anwendung gesendet.

Allerdings aus meiner DCOM-Anwendung nicht :shock:

Ich habe nun schon selber festgestellt, dass das FindWindow das Problem ist.
Das liefert im "DCOM-Modus" 0.

Weiß jemand warum bzw. gibt es Alternativen zum FindWindow?

Danke schon mal.

Gruß Markus

NickelM 1. Jun 2012 19:30

AW: Taste senden/DCOM
 
Eine alternative hab ich jetzt nicht, aber wird die DCOM Anwendung als gleicher Benutzer ausgeführt?
Wenn nicht würd ich sagen, dass er versucht das Fenster auf dem falschen Desktop zufinden.
Müsstest vielleicht eine Suche nach dem Aktiven Desktop machen und dan dort suchen. Eine art "FindWindowOnDesktop"-Funktion gibt es glaub ich net. Villeicht dan alle Fenster mit einer Art Enum Proc vielleicht suchen und dan auf die Eigenschaften wie CLassname prüfen. Für Classname zurückgeben gibt es ne WinAPI das wies ich. Müsstest halt mal schauen.

golisan 1. Jun 2012 19:43

AW: Taste senden/DCOM
 
Die DCOM-Anwendung wird nur von einem Benutzer ausgeführt.
Aber mal eine Enum über alle Fenster könnte ich mal probieren.

NickelM 1. Jun 2012 20:26

AW: Taste senden/DCOM
 
Zitat:

Zitat von golisan (Beitrag 1169129)
Die DCOM-Anwendung wird nur von einem Benutzer ausgeführt.

Ich meinte die DCOM-Anwendung vom gleichen Benutzer, wie die anderen Anwendung ausgeführt wird.

golisan 8. Jun 2012 15:26

AW: Taste senden/DCOM
 
Ich habe mal folgendes gemacht:

Delphi-Quellcode:
function EnumWinProc(Wnd: THandle; LParam: LongInt): Boolean;   stdcall;
var
  WinCaption : string;
  Len: integer;
  name : PChar;
begin
  Result := True;
  Len := GetWindowTextLength(Wnd);
  SetLength(WinCaption, Len);
  GetWindowText(Wnd, PChar(WinCaption), Len+1);
  if Trim(WinCaption) <> '' then
  begin
    Name:= StrAlloc(102);
    GetClassName(wnd, Name, 100);
    showmessage(WinCaption + ':' + name);
    StrDispose(Name);
  end;
end;
Dieses Coding habe ich mal im "DCOM"-Modus und in einer Form-Anwendung laufen lassen.
Es werden die gleichen Fenster gefunden.
Unter anderem auch
NIDEWindowClass Natural 6.2 um die es mir eigentlich geht.

Nehme ich nun das durch den Enum gefundene Handle(NIDEWindowClass Natural 6.2) und versuche in der Hierarchie weiter zu gehen:

Delphi-Quellcode:
//wnd ist durch den Enum gesetzt
wnd := FindWindowEx(wnd, 0, 'MDIClient', nil);
wnd := FindWindowEx(wnd, 0, 'PgmEdtMDIWin', 'B601 [TESTQS] - Program');
liefert der erste FindWindowEX kein Handle zurück :?:

Liegt das evtl. daran, dass mein DCOM-Programm in einem anderem Prozess/Thread läuft und ich von da keinen direkten Zugriff auf die Handles habe(da kenne ich mich nicht aus)
Gibt es Alternativen zum FindWindowEX?

golisan 12. Jun 2012 08:28

AW: Taste senden/DCOM
 
Hallo,

so, habe inzwischen (m)eine Lösung gefunden.
Das Problem war ja, dass der FindWindow und FindWindowEX nicht im DCOM-Modus funktioniert hat.
Warum weiss ich immer noch nicht.
Aus einer Eingebung heraus, habe ich das Suchen der Fenster in eine DLL ausgelagtert und da tut es... :?::wink:

Hier mal der Code:

Delphi-Quellcode:
procedure TCoQS.Set_eGoto(Value: Integer);
var wnd : HWND;
begin
  wnd := sucheFenster(PChar(fNatName)); // Funktion aus DLL
  if wnd <> 0 then
  begin
  SetForegroundWindow(wnd);
  SendMessage(wnd, WM_CHILDACTIVATE, 0, 0); // Sonst kommen die Tasten nicht an

   Sleep(200); // kurz warten

   // CONTROL+G senden
   Keybd_Event(VK_CONTROL,0,0,0);
   Keybd_Event(byte('G'),0,0,0);
   Keybd_Event(byte('G'),0,KEYEVENTF_KEYUP,0);
   Keybd_Event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
   SendMessage(wnd, WM_SETFOCUS, 0, 0);

   sleep(200); // nochmal kurz warten

   // Zeilennummer im GoTo-Dialog eintragen
   wnd := FindWindow('#32770', 'Go To');
   wnd := FindWindowEx(wnd, 0, 'Edit', nil);
   SendMessage(wnd, WM_SETTEXT, 0, Integer(inttostr(value)));

   // auf physische Zeilensuche umstellen
   wnd := FindWindow('#32770', 'Go To');
   wnd := FindWindowEx(wnd, 0, 'Button', '&Physical Line');
   SendMessage(wnd,BM_CLICK,2,0);

   // OK-Button drücken
   wnd := FindWindow('#32770', 'Go To');
   wnd := FindWindowEx(wnd, 0, 'Button', 'OK');
   SendMessage(wnd,BM_CLICK,2,0);

  end
  else
    showmessage('Kein Handle ermittelt');
end;

Hier die DLL
Delphi-Quellcode:
function sucheFenster(name : PChar): HWND; stdcall;
var
  hWndTemp, wnd, pgm: hWnd;
  iLenText: Integer;
  cTitletemp: array [0..254] of Char;
  sTitleTemp: string;
begin
  result := 0;
  wnd := FindWindow('NIDEWindowClass', nil);      //Anwendung suchen
  wnd := FindWindowEx(wnd, 0, 'MDIClient', nil);  //unsichtbares Hintergrundfenster(was immer das auch ist...)
  if wnd <> 0 then begin
// da der Fenstertitel nicht immer gleich ist...umständlich suchen...
    hWndTemp := GetWindow(wnd, GW_CHILD);
    while hWndTemp <> 0 do begin
      iLenText := GetWindowText(hWndTemp, cTitletemp, 255);
      sTitleTemp := cTitletemp;
      sTitleTemp := UpperCase(copy( sTitleTemp, 1, iLenText));
      if pos( name, sTitleTemp ) <> 0 then begin
        result := hWndTemp;
        Exit;
      end;
      hWndTemp := GetWindow(hWndTemp, GW_HWNDNEXT);
    end;
  end;
end;

falls jemand ein ähnliches Problem haben sollte... :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz