C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Программно определить подключён ли кабель к сетевой карте  (Прочитано 3152 раз)
Sasha
Участник


Сказали спасибо: +13/-0
Offline

Сообщений: 413


Программно определить подключён ли кабель к сетевой карте
« : 03 Июль 2015, 20:52:05 »

Здравствуйте!

Ребята подскажите, пожалуйста, можно ли как-то программно определить подключён ли сетевой кабель к сетевой карте?

Заранее спасибо за ответ
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Программно определить подключён ли кабель к сетевой карте
« Ответ #1 : 09 Июль 2015, 14:36:14 »

InternetGetConnectedState
Записан
Sasha
Участник


Сказали спасибо: +13/-0
Offline

Сообщений: 413


Re: Программно определить подключён ли кабель к сетевой карте
« Ответ #2 : 16 Июль 2015, 00:19:10 »

Спасибо, попробую
Записан
Sasha
Участник


Сказали спасибо: +13/-0
Offline

Сообщений: 413


Re: Программно определить подключён ли кабель к сетевой карте
« Ответ #3 : 02 Август 2015, 23:42:13 »

Сделал вот так вот
Код
#include 
#include
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma comment ( lib, "lib\wininet.lib" )
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
       bool state;
       DWORD flags;
       state = InternetGetConnectedState (&flags,0);
       if ( state ) ShowMessage ("Сетевой кабель подключён");
       else ShowMessage ("Сетевой кабель отключен");
}
//---------------------------------------------------------------------------
 

Работает всё нормально.

И задам ещё вопрос. А как сделать чтобы этот код работал в автономном режиме, т.е постоянно определял подключение и отключение кабеля? Заранее благодарен за ответ
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Программно определить подключён ли кабель к сетевой карте
« Ответ #4 : 05 Август 2015, 13:31:10 »

Цитата: Sasha от 02 Август 2015, 23:42:13
И задам ещё вопрос. А как сделать чтобы этот код работал в автономном режиме, т.е постоянно определял подключение и отключение кабеля? Заранее благодарен за ответ

Выполняй функцию проверки в цикле - в отдельном потоке или по таймеру или в событии OnIdle объекта Application или компонента TApplicationEvents.
Записан
Sasha
Участник


Сказали спасибо: +13/-0
Offline

Сообщений: 413


Re: Программно определить подключён ли кабель к сетевой карте
« Ответ #5 : 25 Август 2015, 10:40:00 »

Цитата: S0mbre от 05 Август 2015, 13:31:10
Цитата: Sasha от 02 Август 2015, 23:42:13
И задам ещё вопрос. А как сделать чтобы этот код работал в автономном режиме, т.е постоянно определял подключение и отключение кабеля? Заранее благодарен за ответ

Выполняй функцию проверки в цикле - в отдельном потоке или по таймеру или в событии OnIdle объекта Application или компонента TApplicationEvents.
Сделал в событии OnIdle
Код
#include 
#include
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma comment ( lib, "lib\wininet.lib" )
#pragma resource "*.dfm"
 
TForm1 *Form1;
//-------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 
 Application->OnIdle = MyIdleHandler;
 
}
//-------------------------------------------------------------------
void __fastcall TForm1::MyIdleHandler(TObject *Sender, bool &Done)
{
 bool newState = InternetGetConnectedState (&flags,0);
 
 if (this->state != newState)
 {
   if (newState)
   {
    ShowMessage ("Сетевой кабель подключён");
   }
   else
   {
    ShowMessage ("Сетевой кабель отключен");
   }
 }
 
 this->state = newState;
 Done = false;
}
 

в h-файле
Код
class TForm1 : public TForm
{
__published:    // IDE-managed Components
   TButton *Button1;
   void __fastcall FormCreate(TObject *Sender);
 
private:    // User declarations
public:     // User declarations
 
   __fastcall TForm1(TComponent* Owner);
   void __fastcall MyIdleHandler(TObject *Sender, bool &Done);
    bool state;
    DWORD flags;
 
};
 

Но проблема в том, что сообщение постоянно выскакивает, а мне надо чтобы выскакивало по одному разу, а не по несколько. Можно ли этот код как-то переделать, чтобы удовлетворяло запросам?
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Программно определить подключён ли кабель к сетевой карте
« Ответ #6 : 27 Август 2015, 10:50:32 »

Код
void __fastcall TForm1::MyIdleHandler(TObject *Sender, bool &Done)
{
DWORD flags;
static bool oldstate = false;
bool state = InternetGetConnectedState(&flags, 0);
if(state != oldstate) {
if(state) ShowMessage("Сетевой кабель подключён");
else ShowMessage("Сетевой кабель отключен");
oldstate = state;
}
}
 
Записан
Sasha
Участник


Сказали спасибо: +13/-0
Offline

Сообщений: 413


Re: Программно определить подключён ли кабель к сетевой карте
« Ответ #7 : 27 Август 2015, 14:17:43 »

Цитата: S0mbre от 27 Август 2015, 10:50:32
Код
void __fastcall TForm1::MyIdleHandler(TObject *Sender, bool &Done)
{
DWORD flags;
static bool oldstate = false;
bool state = InternetGetConnectedState(&flags, 0);
if(state != oldstate) {
if(state) ShowMessage("Сетевой кабель подключён");
else ShowMessage("Сетевой кабель отключен");
oldstate = state;
}
}
 

Так не подойдёт оно зацикливается и постоянно вылетает ShowMessage
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Программно определить подключён ли кабель к сетевой карте
« Ответ #8 : 28 Август 2015, 19:54:59 »

Проверил. У меня все нормально, выскакивает только когда подключается или отключается кабель, не постоянно.

Код
//---------------------------------------------------------------------------
#include   // чтобы не было проблем с неймспейсами
#include    // интернет функции WinAPI
#include
#pragma hdrstop
 
#include "Main.h"
#pragma link "wininet.lib"   // линкуем библу
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Idle(TObject *Sender, bool &Done)
{
Done = false; // чтобы запускалось постоянно
if(!CheckBox1->Checked) return; // если не поставлена галочка на форме, выйти
 
DWORD flags;
static bool oldstate = false; // статический флаг
bool state = InternetGetConnectedState(&flags, 0); // читаем статус соединения
if(state != oldstate) { // если статус изменился
if(state) ShowMessage("Сетевой кабель подключён"); // сообщаем в диалоге
else ShowMessage("Сетевой кабель отключен");
oldstate = state; // сохраняем статус
}
}
 
Записан
Sasha
Участник


Сказали спасибо: +13/-0
Offline

Сообщений: 413


Re: Программно определить подключён ли кабель к сетевой карте
« Ответ #9 : 28 Август 2015, 20:47:37 »

Цитата: S0mbre от 28 Август 2015, 19:54:59
Проверил. У меня все нормально, выскакивает только когда подключается или отключается кабель, не постоянно.

Код
//---------------------------------------------------------------------------
#include   // чтобы не было проблем с неймспейсами
#include    // интернет функции WinAPI
#include
#pragma hdrstop
 
#include "Main.h"
#pragma link "wininet.lib"   // линкуем библу
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Idle(TObject *Sender, bool &Done)
{
Done = false; // чтобы запускалось постоянно
if(!CheckBox1->Checked) return; // если не поставлена галочка на форме, выйти
 
DWORD flags;
static bool oldstate = false; // статический флаг
bool state = InternetGetConnectedState(&flags, 0); // читаем статус соединения
if(state != oldstate) { // если статус изменился
if(state) ShowMessage("Сетевой кабель подключён"); // сообщаем в диалоге
else ShowMessage("Сетевой кабель отключен");
oldstate = state; // сохраняем статус
}
}
 

Я так понял ты использовал компонент ApplicationEvents?
Записан
Sasha
Участник


Сказали спасибо: +13/-0
Offline

Сообщений: 413


Re: Программно определить подключён ли кабель к сетевой карте
« Ответ #10 : 28 Август 2015, 20:54:28 »

Не знаю как у тебя, но у меня ничего не изменилось, вылазит окно по нескольку раз (зацикливается). Использую С++ Builder XE4
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Программно определить подключён ли кабель к сетевой карте
« Ответ #11 : 31 Август 2015, 09:16:53 »

Цитата: Sasha от 28 Август 2015, 20:54:28
Не знаю как у тебя, но у меня ничего не изменилось, вылазит окно по нескольку раз (зацикливается). Использую С++ Builder XE4

Прикрепи проект.
Записан
Sasha
Участник


Сказали спасибо: +13/-0
Offline

Сообщений: 413


Re: Программно определить подключён ли кабель к сетевой карте
« Ответ #12 : 31 Август 2015, 15:53:36 »

Вот проект
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


« Ответ #13 : 01 Сентябрь 2015, 07:18:43 »

Я проверил - у меня все нормально работает. Вообще правильнее, конечно, затолкать эту функцию в отдельный поток. Попробуй создать поток и вызывать это из Execute(). Типа

Код
void __fastcall TMyThread::Execute()
{
DWORD flags;
while(!Terminated) {
bool state = InternetGetConnectedState(&flags, 0);
if(state != oldstate) {
if(state) ShowMessage("Сетевой кабель подключён");
else ShowMessage("Сетевой кабель отключен");
oldstate = state;
}
Sleep(100);
}
}
 

Здесь oldstate - член класса TMyThread.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.137 секунд. Запросов: 19.