Announcement

Collapse
No announcement yet.

Wie kann ich mit hilfe von WM_Dropfiles.......

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wie kann ich mit hilfe von WM_Dropfiles.......

    Dateien im hintergrund an ein fremdprogramm per drag&drop senden??
    Hab folgendes Problem, aus meiner delphi anwendung starte ich ein Fremdprogramm, in diesem fremdprogramm kann man per drag&drop dateien in ein listfeld zur bearbeitung einladen.
    nun möchte ich in meiner delphi anwendung das natührlich automatisieren,sprich das ich in meiner anwendung die files auswähle,und sie dann im hintergrund per drag&drop in das listfeld der fremdanwendung übergeben werden.
    ein author der das gleiche fremdprogramm nutzt hat mir folgenden tip gegeben:

    PostMessage(handle(fremdpro),WM_DROPFILES,WParam(h Mem),0);
    Nur weiss ich nicht so recht, wie ich mit diesem befehl die files die gesendet werden sollen mitgeben kann.
    hat jemand irgendeinen tip für mich?????

    Vielen Dank schon mal im Voraus......

  • #2
    hMem ist ein mit GlobalAlloc() alloziertes Speicherhandle.

    <pre>

    var
    hMem: Thandle;
    data: PDragInfoA;
    FileName: String;
    Size: Integer;
    begin
    FileName := 'c:\msdos.sys';
    Size := SizeOf(TDragInfoA) + Length(FileName) +2;
    hMem := GlobalAlloc(Size, GHND);
    Data := GlobalLock(hMem);
    Data.uSize := SizeOf(TDRagInfoA);
    Data.Pt := KoordinateDesZielFenstersInScreenKoordinaten;
    Data.fNC := True;
    Data.grfKeyState := 0; // I don't known
    PChar(Data.lpFileList) := PChar(@Data.grfKeyState) + 4;
    MOve(Pointer(FileName)^, data.lpFileList^, Length(FileName));
    GlobalUnlock(hMem);
    end;

    </pre>

    hMem ist nun das handle für SendMessage(wm_DropFiles,..);
    Der obige code ist nicht getestet.

    Hage

    Comment


    • #3
      <pre>
      <code><font size=2 face="Courier New"><b>uses </b>ShellObj, Windows;
      <br>
      <b>procedure </b>TForm1.Button1Click(Sender: TObject);
      <br>
      <b>function </b>MakeDrop(<b>const </b>FileNames: <b>array of String</b>): THandle;
      <font color="#008080"><i>// erzeugt ein hDrop Object
      </i></font><b>var
      </b>I,Size: Integer;
      Data: PDragInfoA;
      P: PChar;
      <b>begin
      </b><font color="#008080"><i>// berechne notwendig speichergröße
      </i></font>Size := SizeOf(TDragInfoA) +<font color="#0000FF">1</font>;
      <b>for </b>I := <font color="#0000FF">0 </font><b>to </b>High(FileNames) <b>do
      </b>Inc(Size, Length(FileNames[I]) +<font color="#0000FF">1</font>);
      <font color="#008080"><i>// alloziere den speicher
      </i></font>Result := GlobalAlloc(GHND <b>or </b>GMEM_SHARE, Size);
      <b>if </b>Result &lt;&gt; <font color="#0000FF">0 </font><b>then
      begin
      </b>Data := GlobalLock(Result);
      <b>if </b>Data &lt;&gt; <b>nil then
      try
      </b><font color="#008080"><i>// f&uuml;lle daten
      </i></font>Data.uSize := SizeOf(TDragInfoA);
      P := PChar(@Data.grfKeyState) + <font color="#0000FF">4</font>;
      Data.lpFileList := P;
      <font color="#008080"><i>// am ende des headers nun die filenamen getrennt mit #0
      </i></font><b>for </b>I := <font color="#0000FF">0 </font><b>to </b>High(FileNames) <b>do
      begin
      </b>Size := Length(FileNames[I]);
      Move(Pointer(FileNames[I])^, P^, Size);
      Inc(P, Size +<font color="#0000FF">1</font>);
      <b>end</b>;
      <b>finally
      </b>GlobalUnlock(Result);
      <b>end else
      begin
      </b><font color="#008080"><i>// speicher konnte nicht gelockt werden
      </i></font>GlobalFree(Result);
      Result := <font color="#0000FF">0</font>;
      <b>end</b>;
      <b>end</b>;
      <b>end</b>;
      <br>
      <b>function </b>MyEnum(Wnd: hWnd; Res: PInteger): Bool; <b>stdcall</b>;
      <font color="#008080"><i>// suche ein child fenster mit klassennamen 'TEditControl'
      </i></font><b>var
      </b>N: <b>String</b>;
      <b>begin
      </b>SetLength(N, MAX_PATH);
      SetLength(N, GetClassName(Wnd, Pointer(N), Length(N)));
      Result := AnsiCompareText(<font color="#0000FF">'TEditControl'</font>, N) &lt;&gt; <font color="#0000FF">0</font>;
      <b>if not </b>Result <b>then </b>Res^ := Wnd;
      <b>end</b>;
      <br>
      <b>var
      </b>Wnd: HWnd;
      Drop: hDrop;
      <b>begin
      </b><font color="#008080"><i>// suche Delphis Editor Fenster
      </i></font>EnumChildWindows(FindWindow(<font color="#0000FF">'TEditWindow'</font>, <b>nil</b>), @MyEnum, Integer(@Wnd));
      <b>if </b>IsWindow(Wnd) <b>then
      begin
      </b><font color="#008080"><i>// Delphis editor gefunden, also öffne msdos.sys
      </i></font>Drop := MakeDrop([<font color="#0000FF">'c:\msdos.sys'</font>]);
      <b>if </b>Drop &lt;&gt; <font color="#0000FF">0 </font><b>then </b>PostMessage(Wnd, wm_DropFiles, Drop, <font color="#0000FF">0</font>);
      <font color="#008080"><i>// ich weis nicht ob wir den speicher freigeben m&uuml;ssen !!
      // auf alle fälle funktionierts
      </i></font>GlobalFree(Drop);
      <b>end</b>;
      <b>end</b>;
      </font>
      </code></pre>
      &#10

      Comment


      • #4
        Hallo Hagen

        ich könnt vor freude luftsprünge machen,hab deinen code ein wenig
        umgebaut und es klappt suuuuuppppppaaaa.

        hast auf jeden fall was gut bei mir,
        seit einer woche schlag ich mich mit diesem problem rum,endlich ist es geschafft ......

        herzlichen dank nochmal du hast mir echt geholfen,ich glaub ohne dich wäre ich aufgeschmissen gewesen, da mir niemand so recht sagen konnt wie die wm funktioniert.
        es kamen immer nur die einfachen wm messages und shellexecute das mir überhaupt nicht half,da das programm ein wenig eigenwillig mit dem einladen der files ist......

        da hab ich aber noch eine frage, das fremdprogramm erzeugt noch eine progressbar, auch dieses handle habe ich, kann ich die mit irgendeiner message aus meinem programm abfragen??? so das in meinem programm die eigene progressbar den fortschritt des fremdprogramms darstellen kann???

        Comment


        • #5
          <pre>

          <code><font size=2 face="Courier New"><b>uses </b>ComCtrls, CommCtrl;
          <br>
          <b>procedure </b>SynchronizeProgressbar(ProgressBar: TProgressbar; Source: hWnd);
          <b>begin
          </b>ProgressBar.Min := SendMessage(Source, PBM_GetRange, <font color="#0000FF">1</font>, <font color="#0000FF">0</font>);
          ProgressBar.Max := SendMessage(Source, PBM_GetRange, <font color="#0000FF">0</font>, <font color="#0000FF">0</font>);
          ProgressBar.Position := SendMessage(Source, PBM_GetPos, <font color="#0000FF">0</font>, <font color="#0000FF">0</font>);
          <b>end</b>;
          <br>
          <font color="#008080"><i>// allerdings funktioniert das nur mit 32Bit Windows-ProgressBars
          // die mit InitCommonControls() laufen
          <br>
          </i></font>Gruß Hagen
          </font>
          </code></pre&gt

          Comment


          • #6
            Hallo Hagen

            hab nochmal vielen dank für deine unterstützung.
            Weiß das wirklich sehr zu schätzen, das mit der
            Prgressbar hat auch super geklappt,hab zwar jetzt noch andere probleme , aber will dich nicht weiter nerven, da du sicherlich
            noch anderes zu tun hast .
            ALso nochmals herzlichen dank....

            Comment


            • #7
              Stell die Fragen trotzdem, es können andere antworten und vielen anderen ist mit der Lösung geholfen

              Comment


              • #8
                Hallo Hagen,
                Na gut du hast es so gewollt.
                Wie kann ich die tastenkombi strg+s an ein fenster senden???
                hab es schon mit postmessage versucht, klappt aber nicht, hab die tastendrücke nacheinander geschickt.

                2. Problem wie bekomme ich aus einer Fremdanwendung ein statictext das seinen inhalt zur laufzeit hin ändert???
                ein handle hab' ich , aber nur solange wie nichts drin steht, oder ich dann den wert der in den statictext drinsteht, in findwindowex eingebe.
                brauche den statictext aus der fremdanwendung um sie in meinem programm auszuwerten.

                Vielen Dank schon mal.....

                Comment


                • #9
                  Moin meisterproppa,<br>
                  <br>
                  zu Deinem zweiten Problem schau doch mal hier:<br>
                  <br>
                  <a href="/webx?14@@.ee89bc2">maik "Überprüfen, ob ein Fenster einer anderen Anwendung angezeigt wird." 14.01.2002 23:05</a><br>
                  http://www.entwickler-forum.de\webx?14@@.ee89bc2/9<br>
                  <br>
                  wahrscheinlich kommt für Dich die ID des Statics in Frage, um das Handle zu ermitteln. Sollte sich mit einer abgeänderten Version meines Programmes hinbekommen lassen.<br>
                  <br>
                  Zu Deinem ersten Problem:<br>
                  Was hast Du denn genau an das Fenster geschickt, um Strg-S zu simulieren?<br>
                  <br>
                  Ciao<br>
                  Chri

                  Comment


                  • #10
                    hallo
                    also an das fenster hab ich
                    Postmessage(handle,WM_Keydown , Vk_Control,0);
                    Postmessage(handle,WM_Keydown , Ord('S'),0);
                    Postmessage(handle,WM_Keyup, Ord('S'),0);
                    Postmessage(handle,WM_Keyup, VK_Control,0);

                    gesendet,
                    hat natürlich nicht geklappt.....

                    die andere geschichte von dir schau ich mir noch mal genau an,
                    hab's gerade nur überflogen.....
                    kann man die ID von statictext auch mit Winsight herausfinden????

                    Comment


                    • #11
                      Moin meisterproppa,<br>
                      <br>
                      hat denn das Fenster, an den die Messages geschickt werden überhaupt den Keyboardfocus?<br>
                      Ggf. könntest Du dafür auch das Programm benutzen, allerdings das AttachThreadInput Drumherum. Das soll nämlich genau dass sicherstellen.<br>
                      Ob man die ID eines Statictext auch mit WinSight herausfinden kann habe ich nicht geprüft, aber ich gehe mal davon aus. Nur finde ich die Kurzübersicht, wie ich sie da mit CollectChildInfoTemp zusammenstelle übersichtlicher.<br>
                      <br>
                      Ciao<br>
                      Chri

                      Comment


                      • #12
                        hallo Christian

                        Also eingabefokus hat das fenster ?????
                        Aber irgendwie ging das bei ner tastenkombi anders....

                        Comment

                        Working...
                        X