[C++] Автоматическое нажатие на кнопку внутри окна

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Dzhegan, 17 Jan 2011.

  1. Dzhegan

    Dzhegan New Member

    Joined:
    15 Oct 2010
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    Собственно имеется клиент Skype, к которому подключается некоторая программа. При этом внутри скайпа вылетает окно о разрешении подключения данной программы. Задача в том, чтобы в автоматическом режиме подтвердить подключение программы путем нажатия на соответствующую кнопку (если есть другие идеи - буду рад выслушать).

    Вот мои (неработающие) наброски:

    Code:
    	HWND child   = NULL;
    	HWND parent  = NULL;
    	long lengthy = NULL;
    	RECT crd;
    	char o;
    	parent = FindWindow("tSkMainForm.UnicodeClass",NULL);
    	if (parent == NULL)
    	{
    		cout<<"Error"<<GetLastError()<<"\n";
    	}
    	child = FindWindowEx(parent,NULL,"TZapCommunicator",NULL);
    	if (child == NULL)
    	{
    		cout<<"Error "<<GetLastError();
    	}
    	
    	ShowWindow(parent,SW_SHOWNORMAL);
    	GetWindowRect(child, &crd);
    
    	lengthx = crd.right - crd.left;
    
    	for (int posx = lengthx/4; posx >= lengthx/2; posx += 10)
    	{
                    //"тыкаем" мышкой пока не попадем на конопку
    		int posy = 64; //координата Y кнопки
    
    		SendMessage(child, WM_SETCURSOR, (WPARAM)child, MAKELPARAM(HTCLIENT,WM_MOUSEMOVE));
    		PostMessage(child, WM_MOUSEMOVE, NULL, MAKELPARAM(posx,posy));
    		SendMessage(child, WM_MOUSEACTIVATE, (WPARAM)parent, MAKELPARAM(HTCLIENT,WM_LBUTTONDOWN));
    		SendMessage(child, WM_SETCURSOR, (WPARAM)child, MAKELPARAM(HTCLIENT,WM_LBUTTONDOWN));
    		PostMessage(child, WM_LBUTTONDOWN, MK_LBUTTON,MAKELPARAM(posx,posy));
    		SendMessage(child, WM_SETCURSOR, (WPARAM)child, MAKELPARAM(HTCLIENT,WM_LBUTTONUP));
    		PostMessage(child, WM_LBUTTONUP, NULL, MAKELPARAM(posx,posy));
    
    		
    	}
    
    	return 0;
    }
    
    [​IMG]
     
  2. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    Все давно уже придумано. http://zemus.us/05/obxod-avtorizacii-skypeapi.html
     
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    кстати в том, коде лучше чуть под другому сделать
    Code:
     whilet rue do
      begin
        Inc(i);
        // Ищем дескриптор этого самого окошка
        hAccept := FindWindowEx(FindWindow(PChar('tSkMainForm.UnicodeClass'), nil),
          0, PChar('TZapCommunicator'), nil);
        if hAccept <> 0 then break;
        Sleep(1000);
        // Если прождали ~40 сек, выходим из функции
        if i = 40 then Exit;
      end;
    
    
    потому как в первом варианте выходит такая фишка, что даже если нашли кнопку, то всё равно еще секунду будем ждать. а это уже больше палива
     
    1 person likes this.
  4. Dzhegan

    Dzhegan New Member

    Joined:
    15 Oct 2010
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    Спасибо огромное!
    Однако почему-то TABом указатель устанавливается на "Запретить доступ". При этом опытным путем установлено, что после нажатия TAB для установки указателя на "Дать доступ" нужно нажать Shift+Tab.
    Руками Это сделать получается, а вот программно - нет.
    Code:
    	PostMessage(child,WM_KEYDOWN,VK_TAB,0x000F0001);
    	Sleep(200);
    	PostMessage(child,WM_KEYUP,VK_TAB,0xC00F0001);
    	Sleep(2000);
    	
    	PostMessage(child,WM_KEYDOWN,VK_SHIFT,0x002A0001);
    	PostMessage(child,WM_KEYDOWN,VK_TAB,0x000F0001);
    	Sleep(200);
    	PostMessage(child,WM_KEYUP,VK_SHIFT,0xC02A0001);
    	PostMessage(child,WM_KEYUP,VK_TAB,0xC00F0001);