CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Błąd uchwytu do programu

Błąd uchwytu do programu

dział ogólny

Błąd uchwytu do programu

Nowy postprzez mate006 » piątek, 7 stycznia 2011, 15:23

Witam

Chciałem poprawić swój program który przedtem był sterowany za pomocą symulacji kliknięć, jednak cały czas okno musiało być widoczne, no i dzięki poradzie Cyfrowego Barona Uchwyt do programu udało mi dojść do momentu zaznaczonego czerwoną strzałką na screenie.

Posłużyłem się programem Total Commander Ultimate Prime, a dokładniej jego wtyczką procesy, wtyczka pokazała mi takie informacje o procesie:

Obrazek

Chcę się dostać do pola podkreślonego na niebiesko w związku z tym napisałem taki kod:

Kod: Zaznacz cały
HWND h, h2, h3, h4, h5, h6;

h = FindWindow("#32770", "Właściwości: 2 Plus 1 - Chodź Pomaluj Mój Świat.mp3");

if(h == NULL)
{
  ShowMessage("Nie odnaleziono okna programu");
  return;
}

BringWindowToFront(h);

h2 =  FindWindowEx(h, 0, "#32770", "Szczegóły");
if (h2 == NULL)
{
  return;
}

h3 =  FindWindowEx(h2, 0, "SysListView32", "Properties");
if (h3 == NULL)
{
  return;
}

//wykonawca
h4 =  FindWindowEx(h3, 0, "PropertyControlBase", "");
if (h4 == NULL)
{
  ShowMessage("Nie odnaleziono pola");
  return;
}

h5 =  FindWindowEx(h4, 0, "SHELLDLL_MVPEditControl", "");
if (h5 == NULL)
{
  ShowMessage("Nie odnaleziono pola");
  return;
}

h6 =  FindWindowEx(h5, 0, "RICHEDIT50W", "");
if (h6 == NULL)
{
  ShowMessage("Nie odnaleziono pola");
  return;
}


jednak przy h4 wyskakuje że nie znaleziono pola.

P.S
Próbowałem z FindWindowEx(h3, 0, "SysHeader32", NULL); i tutaj znajduje klasę
Avatar użytkownika
mate006
Intelektryk
Intelektryk
 
Posty: 145
Dołączył(a): wtorek, 2 marca 2010, 14:12
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Premium 64
Kompilator: Embarcadero® C++Builder® XE
Gadu Gadu: 0
    Windows 7Firefox

Re: Błąd uchwytu do programu

Nowy postprzez Cyfrowy Baron » piątek, 7 stycznia 2011, 16:08

A na której próbie pobrania uchwytu, nie może go pobrać? Zamiast wszędzie dawać kod:

KOD cpp:     UKRYJ  
  ShowMessage("Nie odnaleziono okna programu");


Powinieneś to bardziej sprecyzować:

KOD cpp:     UKRYJ  
h4 =  FindWindowEx(h3, 0, "PropertyControlBase", "");
if (h4 == NULL)
{
  ShowMessage("Nie odnaleziono pola PropertyControlBase");
  return;
}

h5 =  FindWindowEx(h4, 0, "SHELLDLL_MVPEditControl", "");
if (h5 == NULL)
{
  ShowMessage("Nie odnaleziono pola SHELLDLL_MVPEditControl");
  return;
}

/ itd...


Wtedy będziesz wiedział gdzie dokładnie pojawia się błąd.
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: Błąd uchwytu do programu

Nowy postprzez mate006 » piątek, 7 stycznia 2011, 17:02

Przecież napisałem że przy h4
czyli tutaj:

Kod: Zaznacz cały
h4 =  FindWindowEx(h3, 0, "PropertyControlBase", "");
Avatar użytkownika
mate006
Intelektryk
Intelektryk
 
Posty: 145
Dołączył(a): wtorek, 2 marca 2010, 14:12
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Premium 64
Kompilator: Embarcadero® C++Builder® XE
Gadu Gadu: 0
    Windows 7Firefox

Re: Błąd uchwytu do programu

Nowy postprzez Cyfrowy Baron » piątek, 7 stycznia 2011, 18:42

Więc wychodzi na to, że dalej to nie są obiekty, do których można by pobrać uchwyt. Co to za program?
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: Błąd uchwytu do programu

Nowy postprzez mate006 » piątek, 7 stycznia 2011, 18:52

Właściwości pliku MP3 ;)
Avatar użytkownika
mate006
Intelektryk
Intelektryk
 
Posty: 145
Dołączył(a): wtorek, 2 marca 2010, 14:12
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Premium 64
Kompilator: Embarcadero® C++Builder® XE
Gadu Gadu: 0
    Windows 7Firefox

Re: Błąd uchwytu do programu

Nowy postprzez Cyfrowy Baron » piątek, 7 stycznia 2011, 19:51

Co Ty kpiny sobie tutaj robisz. Na zrzucie ekranu widać wyraźnie, że to aplikacja o nazwie MP3.exe

mp3.png
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
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: Błąd uchwytu do programu

Nowy postprzez mate006 » piątek, 7 stycznia 2011, 19:58

Bo właściwości pliku MP3 są uruchamiane przez mój program który się tak nazywa, poprzez:

Kod: Zaznacz cały
void ShowProperties(String FileName)
{
SHELLEXECUTEINFO ShExecInfo ={0};
ShExecInfo.cbSize = sizeof(ShExecInfo);
ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ;
ShExecInfo.hwnd = GetDesktopWindow();
ShExecInfo.lpVerb = "properties";
ShExecInfo.lpFile = FileName.c_str();
ShExecInfo.lpParameters = "Szczegóły";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
}
//---------------------------------------------------------------------------
Avatar użytkownika
mate006
Intelektryk
Intelektryk
 
Posty: 145
Dołączył(a): wtorek, 2 marca 2010, 14:12
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Premium 64
Kompilator: Embarcadero® C++Builder® XE
Gadu Gadu: 0
    Windows 7Firefox

Re: Błąd uchwytu do programu

Nowy postprzez Cyfrowy Baron » piątek, 7 stycznia 2011, 20:10

A jak udało się Tobie podejrzeć proces okna właściwości we wtyczce Procesy, gdyż u mnie na liście nic się nie wyświetla mimo iż okno właściwości jest uruchomione?
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: Błąd uchwytu do programu

Nowy postprzez mate006 » piątek, 7 stycznia 2011, 20:19

Też tak sprawdzałem i nie wykryło mi tego procesu, jedyny sposób to przez ten program, ponieważ robi uchwyt, na zrzucie ekranu jest mój program "Menadżer MP3"

Obrazek
Avatar użytkownika
mate006
Intelektryk
Intelektryk
 
Posty: 145
Dołączył(a): wtorek, 2 marca 2010, 14:12
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Premium 64
Kompilator: Embarcadero® C++Builder® XE
Gadu Gadu: 0
    Windows 7Firefox

Re: Błąd uchwytu do programu

Nowy postprzez Cyfrowy Baron » piątek, 7 stycznia 2011, 20:32

Nic z tego nie rozumiem, pobierasz uchwyt do okna właściwości, ale sprawdzasz to poprzez swój program i jakiś menadżer MP3... :mrgreen: Dam sobie z tym spokój...
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: Błąd uchwytu do programu

Nowy postprzez mate006 » piątek, 14 stycznia 2011, 12:51

Rozwiązałem zagadkę czemu nie wykrywa tego okna, po prostu trzeba wcześniej kliknąć na to pole, i tu moje pytanie jak to zrobić?

P.S.
Tutaj jest kod źródłowy (W formie komentarza umieściłem moje obecne problemy)

KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
void ShowProperties(String FileName)
{
 SHELLEXECUTEINFO ShExecInfo ={0};
 ShExecInfo.cbSize = sizeof(ShExecInfo);
 ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ;
 ShExecInfo.hwnd = GetDesktopWindow();
 ShExecInfo.lpVerb = "properties";
 ShExecInfo.lpFile = FileName.c_str();
 ShExecInfo.lpParameters = "Szczegóły";
 ShExecInfo.lpDirectory = NULL;
 ShExecInfo.nShow = SW_SHOW;
 ShExecInfo.hInstApp = NULL;
 ShellExecuteEx(&ShExecInfo);
}
//---------------------------------------------------------------------------
int CONVERT(String litera)
{
 for(int i = -113; i <= 255; i++)
 {
  if(litera == CHAR(i))
   return i;
 }
 return 0;
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (OpenDialog1->Execute())
{
 Edit1->Text = ExtractFileName(OpenDialog1->FileName);
 ShowProperties(OpenDialog1->FileName);
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
 HWND h, h2, h3, h4, h5, h6;


 h = FindWindow(NULL,("Właściwości: "+ Edit1->Text).c_str());

 if(h == NULL)
 {
  ShowMessage("Nie odnaleziono okna właściwości pliku");
  return;
 }

 h2 =  FindWindowEx(h, 0, "#32770", "Szczegóły");
 if (h2 == NULL)
 {
  ShowMessage("Nie odnaleziono pola #32770");
  return;
 }

 h3 =  FindWindowEx(h2, 0, "SysListView32", "Properties");
 if (h3 == NULL)
 {
  ShowMessage("Nie odnaleziono pola SysListView32");
  return;
 }

 h4 =  FindWindowEx(h3, 0, "PropertyControlBase", NULL);      // doszedłem z tym do ładu
 if (h4 == NULL)                                              // chodzi o to że nie wykrywa tego pola jeżeli nie
 {                                                            // jest zaznaczone, i tutaj moje pytanie

  ShowMessage("Nie odnaleziono pola PropertyControlBase");   // Jak zaznaczyć to pole oraz
  return;                                                    // Jak poruszać się tych polach góra i dół czy w ogóle się da
 }

 h5 =  FindWindowEx(h4, 0, "SHELLDLL_MVPEditControl", "");
 if (h5 == NULL)
 {
  ShowMessage("Nie odnaleziono pola SHELLDLL_MVPEditControl");
  return;
 }

 h6 =  FindWindowEx(h5, 0, "RICHEDIT50W", "");
 if (h6 == NULL)
 {
  ShowMessage("Nie odnaleziono pola RICHEDIT50W");
  return;
 }

 SendMessage(h6, WM_CHAR, VK_BACK, 1);  // chcę by mi wyczyściło zawartość pola przed dodawaniem
                                       // jednak nic się nie dzieje

 String nazwa = Edit1->Text;
 String tekst = nazwa.SubString(1,nazwa.LastDelimiter("-")-2).Trim();

 for(int i = 1; i <= tekst.Length(); i++)
 {
  String tmp = tekst.SubString(i, 1);
  WORD a = CONVERT(tmp);
  SendMessage(h6, WM_CHAR, (WPARAM)a, 1);
 }
}
//---------------------------------------------------------------------------
Avatar użytkownika
mate006
Intelektryk
Intelektryk
 
Posty: 145
Dołączył(a): wtorek, 2 marca 2010, 14:12
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Premium 64
Kompilator: Embarcadero® C++Builder® XE
Gadu Gadu: 0
    Windows 7Firefox

Re: Błąd uchwytu do programu

Nowy postprzez Cyfrowy Baron » piątek, 14 stycznia 2011, 13:09

Niestety w Windows XP wogóle nie mogę podejrzeć tego okna i sprawdzić jego klasy, gdyż u mnie to okno nie widnieje nigdzie jako odrębny proces. Nie mogąc tego sprawdzić, nie mogę pomóc.
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: Błąd uchwytu do programu

Nowy postprzez mate006 » piątek, 14 stycznia 2011, 13:16

Ależ oczywiście że się da,

u mnie też jak uruchomię właściwości pliku to nie ma tego procesu, jednak wystarczy wywołać to okno przez program i znajdzie się w procesach

Dołączam okrojony program z kodem
Ostatnio edytowano piątek, 14 stycznia 2011, 13:25 przez Cyfrowy Baron, łącznie edytowano 1 raz
Powód: Usunięto załącznik, gdyż nie dział poprawnie. Proszę dodać poprawny plik.
Avatar użytkownika
mate006
Intelektryk
Intelektryk
 
Posty: 145
Dołączył(a): wtorek, 2 marca 2010, 14:12
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Premium 64
Kompilator: Embarcadero® C++Builder® XE
Gadu Gadu: 0
    Windows 7Firefox

Re: Błąd uchwytu do programu

Nowy postprzez Cyfrowy Baron » piątek, 14 stycznia 2011, 13:21

Nie mogę uruchomić tego programu, gdyż ja korzystam z C++Builder 2010. Krótko mówiąc musisz skompilować program razem z bibliotekami. Kod jest zbędny. Poza tym jak zamieszczasz pliki źródłowe to usuwaj z nich pliki tymczasowe, gdyż na nic się nie przydają.

Pliki tymczasowe projektu to: *.~??; *.~?; *.obj; *.tds; *.#??; *.pch; *.ilc; *.ild; *.ils; *.ilf; gdzie znak zapytania oznacza dowolny znak.
Te pliki są tworzone każdorazowo podczas kompilacji, więc można się ich spokojnie pozbyć. By nie usuwać tego ręcznie możesz w Notatniku napisać:

KOD text:     UKRYJ  
del *.~??
del *.~?
del *.obj
del *.tds
del *.#??
del *.pch
del *.ilc
del *.ild
del *.ils
del *.ilf
Potem zapisujesz to pod dowolną nazwą w katalogu projektu, ale z rozszerzeniem BAT, np. clan.bat i uruchamiasz. pliki zostaną usunięte..
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: Błąd uchwytu do programu

Nowy postprzez mate006 » piątek, 14 stycznia 2011, 13:28

Przesyłam sam program
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
mate006
Intelektryk
Intelektryk
 
Posty: 145
Dołączył(a): wtorek, 2 marca 2010, 14:12
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Premium 64
Kompilator: Embarcadero® C++Builder® XE
Gadu Gadu: 0
    Windows 7Firefox

Następna strona

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 4 gości