Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

[.NET + WinApi] Generowanie fokusa do innej aplikacji



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Biblioteki
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Bassman



Dołączył: 14 Cze 2005
Posty: 140
Skąd: Bydgoszcz

PostWysłany: Pią Lut 24, 2017 12:39 pm  OP    Temat postu: [.NET + WinApi] Generowanie fokusa do innej aplikacji Odpowiedz z cytatem Pisownia

Witam
Mam dwie aplikacje które współpracują ze sobą korzystając z jednej bazy danych, Pierwsza aplikacja mojej produkcji o nazwie (A) wysyłająca do bazy wiersz "X", druga aplikacja (B) innego autora, aby odczytała wiersz przeze mnie zapisany do bazy "X" należy w nią kliknąć, a dokładniej w jej grid'a wtedy następuje odświeżenie. I teraz nie mając możliwości w ingerencje kodu aplikacji (B) wymyśliłem sobie, że za pomocą WinApi wymuszę z aplikacji (A), po dodaniu wiersza "X" do bazy danych, odświeżęnie w aplikacji (B), więc musiałbym wygenerować albo Fokus albo Click myszką w aplikacje (B)
Pomożecie jaki WinApi do tego wykorzystać ?
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora Numer GG
Olo



Dołączył: 22 Sty 2010
Posty: 172

PostWysłany: Sob Lut 25, 2017 1:38 am      Temat postu: Odpowiedz z cytatem Pisownia

Poeksperymentuj z poniższym programikiem napisanym naprędce.
Zadziała na starcie, po kliknięciu prawym klawiszem myszki oraz
po wciśnięciu lewego i puszczeniu go nad innym programem.

Programik szuka nazwy klasy głównego okna programu, a następnie
znajduje uchwyt tego okna.

Trzeba wcześniej uruchomić Notatnik, można wpisać kilka literek.

Kod:

#include <windows.h>

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

BOOL CALLBACK WyliczDzieciaczki(HWND hwnd, LPARAM lParam)
{
   char ClassName[55] = {0};
   //Notatnik ma dwa okna potomne, ale tylko jedno klasy "Edit"
   GetClassName(hwnd, ClassName, 50 );
  
   if ( !lstrcmp(ClassName, "Edit"))
   {
      *(HWND*)lParam = hwnd;
      return FALSE;
   }
   return TRUE;
}

BOOL CALLBACK EnumWndProc (HWND hwnd, LPARAM lParam)
{
   char ClassName[55] = {0};
  
   if ( IsWindowVisible(hwnd) )
   {
      GetClassName(hwnd, ClassName, 50);
      lstrcat((char*)lParam, ClassName);
      lstrcat((char*)lParam, "\r\n");
   }
   return TRUE;
}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPSTR lpszArgument, int nCmdShow)
{              
   static
   WNDCLASS    wndclass ;
   HWND        hwnd;
   MSG         msg;
  
   wndclass.lpfnWndProc   = WndProc ;
   wndclass.hInstance     = hInstance ;
   wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
   wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
   wndclass.lpszClassName = "test" ;


   if (!RegisterClass (&wndclass))
        return 0;
  
   hwnd = CreateWindow ("test", "Test",
            WS_OVERLAPPEDWINDOW, 100, 200, 600, 200,
            NULL, NULL, hInstance, NULL) ;

   ShowWindow (hwnd, nCmdShow ) ;
   UpdateWindow(hwnd);
    
   while ( GetMessage (&msg, NULL, 0, 0) )
   {
      TranslateMessage (&msg) ;
      DispatchMessage (&msg) ;
   }
   return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   static HWND hwndNotepad, hwndNotepadEdit;
   static HWND hwndEdit;
   char   NotepadEditTekst[200];
   char   NotepadClassName[50];
   char   Tekst[1000];//powinno wystarczyć :-)
   POINT  Mysza;
   PAINTSTRUCT ps ;
   HDC         hdc ;
  
   switch (message)
   {
   case WM_CREATE :

      hwndEdit = CreateWindow ("edit", 0,
         WS_CHILD | WS_VISIBLE | ES_MULTILINE | WS_VSCROLL,
         0, 0, 500, 100, hwnd, NULL, ((LPCREATESTRUCT)lParam)->hInstance, NULL) ;

      hwndNotepad = FindWindow(NULL, "Bez tytułu - Notatnik");
      
      if (hwndNotepad)
      {
         EnumChildWindows (hwndNotepad, WyliczDzieciaczki, (LPARAM)&hwndNotepadEdit) ;
         SendMessage(hwndNotepadEdit, WM_GETTEXT, (WPARAM)150, (LPARAM)NotepadEditTekst) ;
        
         GetClassName(hwndNotepad, NotepadClassName, 40);
         wsprintf(Tekst, "Tekst: %s \r\n NotepadClassName: %s",
                           NotepadEditTekst, NotepadClassName);
                          
         SetWindowText(hwndEdit, Tekst) ;
         SendMessage(hwndNotepadEdit, WM_SETTEXT, (WPARAM)0, (LPARAM)Tekst) ;
         //wcale nie jest pewne czy to zaktualizuje zawartość okna
         UpdateWindow(hwndNotepad);
         SetForegroundWindow(hwndNotepad);
         SetFocus(hwndNotepad);
      }
      else
      {
         SetWindowText(hwndEdit, "Nie znaleziono okna") ;
      }
      return 0 ;
  
   case WM_RBUTTONDOWN:
      hwndNotepad = FindWindow("Notepad", 0);
      wsprintf(Tekst, "Uchwyt ze znanej klasy: 0x%X \r\n\r\n"
                      "Klasy widocznych okien:\r\n", hwndNotepad );
      
      EnumWindows(EnumWndProc, (LPARAM)Tekst);
      SetWindowText(hwndEdit, Tekst) ;
      
      UpdateWindow(hwndNotepad);
      SetForegroundWindow(hwndNotepad);
      SetFocus(hwndNotepad);      
      break;    

   case WM_LBUTTONDOWN:
      SetCapture(hwnd);
      break;    
      
   case WM_LBUTTONUP:
      Mysza.x = (SHORT)LOWORD(lParam) ;
      Mysza.y = (SHORT)HIWORD(lParam) ;
      ClientToScreen(hwnd, &Mysza) ;
      
      hwndNotepadEdit = WindowFromPoint(Mysza);
      
      if ( hwndNotepadEdit )
      {
         HWND hwndMatka;
         hwndMatka = hwndNotepadEdit;
         while ( (hwndMatka = GetParent(hwndMatka)) )
         {
            hwndNotepad = hwndMatka;
         }
         //GetParent() zwróciło 0, hwndNotepad jest oknem głównym
         GetClassName(hwndNotepad, NotepadClassName, 44 );
         SetWindowText(hwndEdit, NotepadClassName);
        
         UpdateWindow(hwndNotepad);
         SetForegroundWindow(hwndNotepad);
         SetFocus(hwndNotepad);
      }
      else
      {
         SetWindowText(hwndEdit, "Nie znaleziono okna");
      }
      ReleaseCapture() ;
      break;
      
   case WM_PAINT:
      hdc = BeginPaint (hwnd, &ps) ;
      EndPaint (hwnd, &ps) ;
      return 0 ;  
      
   case WM_DESTROY:
      PostQuitMessage (0) ;
      return 0 ;
      
   }
   return DefWindowProc (hwnd, message, wParam, lParam) ;
}



_________________
2 × 2 = 3,999999999997
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Biblioteki Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.14335 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |