CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Wykrywanie Drag&Drop

Wykrywanie Drag&Drop

dział ogólny

Wykrywanie Drag&Drop

Nowy postprzez beherit » poniedziałek, 25 czerwca 2012, 21:50

Chcę w programie sprawdzać czy użytkownik w danym momencie przeciąga pliki lub cokolwiek innego za pomocą metody Drag&Drop. Do tego celu znalazłem w MSDN funkcję DragDetect (http://msdn.microsoft.com/en-us/library ... 85%29.aspx), która działa i sprawdza się znakomicie lecz niestety tylko dla okien należących do procesu aplikacji. Gdy wywołam funkcję w podany niżej sposób, to mimo przeciągania plików nie jest zwracana wartość true:
Kod: Zaznacz cały
DragDetect(WindowFromPoint(Mouse->CursorPos),Mouse->CursorPos);

Moje pytanie brzmi: jak sprawdzić czy w danym momencie user przeciąga jakieś pliki etc?
Obrazek
Avatar użytkownika
beherit
Homos antropiczny
Homos antropiczny
 
Posty: 62
Dołączył(a): poniedziałek, 16 lutego 2009, 19:55
Lokalizacja: Jarocin
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++Builder XE5
Gadu Gadu: 0
    Windows 7Firefox

Re: Wykrywanie Drag&Drop

Nowy postprzez Cyfrowy Baron » poniedziałek, 25 czerwca 2012, 23:16

A w jakim zdarzeniu wywołujesz tą funkcję? Chociaż to chyba bez znaczenia bo funkcja zgodnie z opisem w pliku pomocy działa tylko w obrębie programu w którym została wywołana.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wykrywanie Drag&Drop

Nowy postprzez beherit » wtorek, 26 czerwca 2012, 18:00

No właśnie wiem o tym i szukam jakiegoś innego rozwiązania. Zdarzenie nie jest w sumie ważne ale jeżeli pytasz to powinno być wywoływane w timerze wtedy kiedy zostaną spełnione pewne warunki.
Obrazek
Avatar użytkownika
beherit
Homos antropiczny
Homos antropiczny
 
Posty: 62
Dołączył(a): poniedziałek, 16 lutego 2009, 19:55
Lokalizacja: Jarocin
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++Builder XE5
Gadu Gadu: 0
    Windows 7Firefox

Re: Wykrywanie Drag&Drop

Nowy postprzez Cyfrowy Baron » środa, 27 czerwca 2012, 09:18

Chcesz zrobić obsługę metody Przeciągnij-Upuść dla swojego programu, czyli chcesz przeciągać do swojego programu jakieś pliki i program ma to obsłużyć? Jeżeli tak to to całe sprawdzanie czy coś zostało przeciągnięte czy nie, jest zupełnie niepotrzebne. Nigdy czegoś podobnego nie robiłem, ale czytałem trochę o tym i skądinąd wiem, że jest to bardziej skomplikowane i jedną funkcją nie da się tego załatwić.

Na wypadek, gdyby o to właśnie Tobie chodziło, zamieszczam kod wczytywania pliku do Memo1 własnego programu metodą Drag & Drop, czyli przeciągamy np. plik z Exploratora Windows lub Total Commandera do naszego programu, a on go wczytuje:

Plik nagłówkowy np. Unit1.h
KOD cpp:     UKRYJ  
private:
                TWndMethod WndOldProc;
                void __fastcall WndNewProc(TMessage& Message);


Plik źródłowy np. Unit1.cpp
KOD cpp:     UKRYJ  
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 WndOldProc = Memo1->WindowProc;
 Memo1->WindowProc = WndNewProc;
 DragAcceptFiles(Memo1->Handle, true);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WndNewProc(TMessage& Message)
{
  if(Message.Msg == WM_DROPFILES)
  {
   int length;

   String FileName;

   HDROP drop_handle = (HDROP)Message.WParam;

   int filenum = DragQueryFile(drop_handle, -1, NULL, NULL);

   for(int i = 0; i < filenum; i++)
   {
        FileName.SetLength(1024);
        length = DragQueryFile(drop_handle, i, FileName.c_str(), 1024);
        FileName.SetLength(length);
   }

   DragFinish(drop_handle);

   /* tutaj następuje wczytanie pliku */
   Memo1->Lines->LoadFromFile(FileName);
  }

  WndOldProc(Message);
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wykrywanie Drag&Drop

Nowy postprzez beherit » czwartek, 28 czerwca 2012, 19:26

Problem w tym, że nie chcę obsługiwać Drag&Drop w swojej aplikacji ;) Mam blokadę pewnej funkcji, gdy jest wciśnięty LPM/PPM ale chcę zezwolić na wywołanie funkcji kiedy przeciągami plik (i nie chodzi tutaj o przeciąganie pliku w obrębie mojej aplikacji a w obrębie krawędzi ekranu, gdzie pod kursorem może być dosłownie każda aplikacja).
Obrazek
Avatar użytkownika
beherit
Homos antropiczny
Homos antropiczny
 
Posty: 62
Dołączył(a): poniedziałek, 16 lutego 2009, 19:55
Lokalizacja: Jarocin
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++Builder XE5
Gadu Gadu: 0
    Windows 7Firefox

Re: Wykrywanie Drag&Drop

Nowy postprzez Cyfrowy Baron » czwartek, 28 czerwca 2012, 23:00

Tutaj może pomóc tylko keyloger, który będzie przechwytywał komunikaty i reagował na mysz.
Patrz: http://programowanie.cal.pl/cyfbar/api4.html#api4 i http://programowanie.cal.pl/forum/viewtopic.php?f=2&t=1436&p=10552&hilit=r#p10546
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wykrywanie Drag&Drop

Nowy postprzez beherit » sobota, 30 czerwca 2012, 22:30

Taki hook w sumie nic nie da, nie ma (albo nie wiem o jego istnieniu) wiadomości która by świadczyła o tym, że user używa Drag&Drop. Samo wykrycie wciskania LPM w tym momencie jest zbędne.
Obrazek
Avatar użytkownika
beherit
Homos antropiczny
Homos antropiczny
 
Posty: 62
Dołączył(a): poniedziałek, 16 lutego 2009, 19:55
Lokalizacja: Jarocin
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++Builder XE5
Gadu Gadu: 0
    Windows 7Firefox

Re: Wykrywanie Drag&Drop

Nowy postprzez Cyfrowy Baron » niedziela, 1 lipca 2012, 00:15

Niestety system nie przechowuje informacji o metodzie Drag & Drop. Jednak można to wykryć wystarczy przechwycić dwa komunikaty, pierwszy o tym, że wciśnięty jest lewy przycisk myszy WM_LBUTTONDOWN i drugi, że kursor myszy jest przesuwany WM_MOUSEMOVE, trzeba też sprawdzać, czy po komunikatach WM_LBUTTONDOWN i WM_MOUSEMOVE wystąpił komunikat WM_LBUTTONUP. Jeżeli tak to znaczy, że Drag & Drop już przestał działać. Jeżeli po komunikacie WM_LBUTTONDOWN od razu wystąpił komunikat WM_LBUTTONUP to znaczy, że nie było Drag & Drop. To chyba oczywiste...!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wykrywanie Drag&Drop

Nowy postprzez beherit » niedziela, 1 lipca 2012, 23:10

Niestety to nie jest takie oczywiste jak myślisz :) To, że zrobię hooka, który mi wskaże wciśnięcie LPM oraz przesunięcie kursora nic nie da bo nie wskaże to, że user właśnie użył Drag&Drop dla plików - równie dobrze może on właśnie zaznaczać parę plików na pulpicie czy też łapać scroll przeglądarki i przesuwać góra/dół. Te rozwiązanie niestety mi nie pomaga, działa identycznie jak GetKeyState czy GetAsyncKeyState.
Obrazek
Avatar użytkownika
beherit
Homos antropiczny
Homos antropiczny
 
Posty: 62
Dołączył(a): poniedziałek, 16 lutego 2009, 19:55
Lokalizacja: Jarocin
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++Builder XE5
Gadu Gadu: 0
    Windows 7Firefox

Re: Wykrywanie Drag&Drop

Nowy postprzez Cyfrowy Baron » poniedziałek, 2 lipca 2012, 20:20

To fakt! To niestety nie przesądza o Drag & Drop.

beherit napisał(a):działa identycznie jak GetKeyState czy GetAsyncKeyState.


Nie bardzo rozumiem? Hak działa tak samo jak te funkcje? Z całą pewnością nie. Hak działa globalnie przechwytując komunikaty, a wspomniane funkcje tylko sprawdzają stan przycisków, nie przechwytują komunikatów i nie zareagują jeżeli okno programu w którym te funkcje się znajdują nie będzie w danym momencie aktywne, ewentualnie możesz cyklicznie wywoływać te funkcje w time'rze, ale to nie jest optymalne, gdyż wiele stanów zostanie pominiętych.

Przejrzałem dokumentacje i nie znalazłem żadnego komunikatu dla Drag & Drop.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 60 gości

cron