[Delphi]Obsługa dwóch monitorów

0

Witam. Kolejna zagadka z cyklu dziwnych. Athlon 2000XP + Nvivdia GeForce 6600 2xDVI i mam następującą zagadkę. Chciałbym aby na jednym monitorze wyświetlany był pulpit windowsa i dało się go normalnie obsługiwać a na drugim (ekran dotykowy Neway 7') wyświetlany był program delphi i obsługiwany był przez panel dotykowy.... Macie jakiś pomysł ?? Ew. Czy jest jakiś komponent umożliwiający rozdzielenie pulpitów i umożliwienie obsługi każdego przez inne urządzenie np mysz i touchpad...

0

Ustawiasz w windowsie dwa monitory w tryb dualview i masz wsio co chciałeś.
Formę musisz sobie sam wypozycjonować na konkretny monitor - w Screen.Monitors[nr_monitora] masz wymiary i "pozycję" monitora

0

no nie wiem ... zauważ że panel dotykowy działa jak myszka ... tzn. ustawia wskaźnik myszki w konkretnym miejscu. i teraz tak... powiedzmy że panel dotykowy będzie obługiwał monitor 1 a myszka i monitor lcd monitor 2, i teraz ... menu start i pasek systemowy będzie zaczynał się na monitorze 1 a kończył na monitorze 2. A np. jak otworzę przeglądarkę internetową to otworzy się na cały pulpit czyli zajmie monitor 1 i 2... (wg sterowników i identyfikacji monitorów) a mnie zależy na dwóch osobnych pulpitach niezależnych od siebie gdzie w pierwszym odpalony będzie tylko program a na drugim będzie normalna obsługa komputera... czyli standardowy pulpit... czyli tak jakbyś miał dwa osobne komputery... Chodzi mi o to że pierwszy będzie panel dotykowy do obsługi systemu inteligentnego domu a drugi panel LCD wiszący w kuchni nad blatem, ma pokazywać przepisy itp. Jeśli nie uda mi się jakoś tego podzielić to będę musiał pisać program zajmujący oba monitory włącznie z moją własną dostosowaną do tego przeglądarką internetową która zajmie tylko drugi monitor...

0

oczywiście zrobiłeś jak ci napisałem i nie działało...

0

tak jak misiek napisal.
nie wiem tylko jak wyglada sprawa myszki... bo chyba bedziesz mogl wyjechac myszka po za monitor 1 (z pulpitem). zawsze mozesz ja zablokowac zeby nie wyjezdzala po za obszar pierwszego monitora.
"no tak ale jak zablokuje to i panelem nie klikne" - poszukaj bo gdzies byl kod umozliwiajacy sprawdzenie ktora myszka jest odpowiedzialna za dane dzialanie ;]

0

ja tylko dodam, że nie zrobisz tego co chcesz tak jak chcesz.
Jak na razie są mi znane jedynie dwa rozwiązania - pierwsze to MultiPoint SDK z .NET 3 + Microsoft Expression Blend oraz drugie to Microsoft Touch Pack for Windows 7.
Generalnie windows pokazuje tylko jeden wskaźnik myszy (poza tymi dwoma przypadkami) i tego nie przeskoczysz

0
Misiekd napisał(a)

Generalnie windows pokazuje tylko jeden wskaźnik myszy (poza tymi dwoma przypadkami) i tego nie przeskoczysz

przeskoczysz ;]
zakladasz na mysz globalnego hooka. ten rozpoznaje z ktorego urzadzenia pochodzi message.
jesli z myszki to ok.
jesli z panelu dotykowego to blokuje wiadomosc (wiec systemowy kursor nie dziala), ale za to porusza virtualnym kursorem (np forma o takim ksztalcie) w drugiej aplikacji.
przy okazji w hooku blokujesz zeby systemowy kursor nie mogl opuscic obszaru pierwszego monitora.

teraz tak sobie jeszcze mysle... dwa monitory... a co z focusem okien? chyba trzeba po prostu zadbac o to, by nasze okno nigdy nie bylo aktywne.

0

tylko, że ekran dotykowy działa jak mysz i operuje na tych samych message'ach co "normalna" mysz.

btw w którym miejscu jesteś w stanie stwierdzić skąd pochodzi message? Pytam bo by mi się taka wiedza przydała, w callback proc nigdzie nie widzę jakiegoś parametru, który by o tym mówił

0
Misiekd napisał(a)

tylko, że ekran dotykowy działa jak mysz i operuje na tych samych message'ach co "normalna" mysz.

btw w którym miejscu jesteś w stanie stwierdzić skąd pochodzi message? Pytam bo by mi się taka wiedza przydała, w callback proc nigdzie nie widzę jakiegoś parametru, który by o tym mówił

tu:

cimak napisał(a)

"no tak ale jak zablokuje to i panelem nie klikne" - poszukaj bo gdzies byl kod umozliwiajacy sprawdzenie ktora myszka jest odpowiedzialna za dane dzialanie

czyli:
http://4programmers.net/Forum/viewtopic.php?id=108115 (a konkretnie: http://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200511/200511_05110114.html)

wlasnie przed chwila napisalem "prototyp":
mam na formie czerwony TPanel
jak ruszam mysza to rusza sie tylko kursor
jak touchpadem to rusza sie Panel a kursor stoi w miejscu ;]
trzeba tylko zrobic z tego hooka (na razie blokowanie zrobilem clipcursor'em).

//hehe, chyba troche popisze i zaczne pracowac na windowsie na dwie myszki :D

//uchwyt urzadzenia sie zmienia wiec nie mozna po nim identyfikowac urzadzenia. szukalem w necie jak zrobic liste tych urzadzen zeby mozna bylo w konfiguracji programu wybrac np ekran dotykowy, ale niestety nie znalazlem nigdzie zadnego kodu. napisalem wiec sam i wklejam, moze komus sie przyda:

type
  RAWINPUTDEVICELIST = record
    hDevice: THANDLE;
    dwType: DWORD;
  end;

const
  RIM_TYPEMOUSE               = $00000000;
  RIM_TYPEKEYBOARD            = $00000001;
  RIM_TYPEHID                 = $00000002;
  RIDI_DEVICENAME             = $20000007;

function GetRawInputDeviceList(pRawInputDeviceList: pointer; puiNumDevices: pointer; cbSize: UINT): UINT; stdcall; external 'user32.dll';
function GetRawInputDeviceInfoA(hDevice: THandle; uiCommand:UINT; pData: Pointer; pcbSize: Pointer): UINT; stdcall; external 'user32.dll';
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var devices: packed array[0..100] of RAWINPUTDEVICELIST;
    devCount:integer;
    i:integer;
    devType:String;
    devName:array[0..256] of char;
    dwSize: UINT;
begin
GetRawInputDeviceList(nil, @devCount, sizeof(RAWINPUTDEVICELIST));//liczba urzadzen
GetRawInputDeviceList(@devices, @dwSize, sizeof(RAWINPUTDEVICELIST));//lista urzadzen

ListBox1.Items.Add(   inttostr(devCount)+' devices:'   );
for i:=0 to devCount-1 do
        begin
//        if devices[i].dwType<>RIM_TYPEMOUSE
//                then continue;
                case devices[i].dwType of
                   RIM_TYPEMOUSE    : devType:='RIM_TYPEMOUSE';
                   RIM_TYPEKEYBOARD : devType:='RIM_TYPEKEYBOARD';
                   RIM_TYPEHID      : devType:='RIM_TYPEHID';
                end;
        dwSize:=sizeof(DevName);
        GetRawInputDeviceInfoA(devices[i].hDevice, RIDI_DEVICENAME, @DevName, @dwSize);//nazwa urzadzenia

        listbox1.Items.Add(devType);
        listbox1.Items.Add('            '+devName);
        listbox1.Items.Add('            '+'hDevice:'+ inttostr(devices[i].hDevice));
        ListBox1.Items.Add('');
        end;
end;

u mnie zwraca 5 urzadzen (w rzeczywistosci klawiatura i touchpad w laptopie +myszka usb. a te dwa pozostale to nie wiem co to):

RIM_TYPEMOUSE - myszka na usb
??\HID#Vid_04f3&Pid_0210#6&33b8a5a0&0&0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}
hDevice:228134933

RIM_TYPEKEYBOARD - ?
??\Root#RDP_KBD#0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}
hDevice:65635

RIM_TYPEKEYBOARD - klawiatura
??\ACPI#PNP0303#4&38462492&0#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}
hDevice:65633

RIM_TYPEMOUSE - ?
??\Root#RDP_MOU#0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}
hDevice:65611

RIM_TYPEMOUSE - touchpad
??\ACPI#SYN0703#4&38462492&0#{378de44c-56ef-11d1-bc8c-00a0c91405dd}
hDevice:65607

0

Screen->Width Screen->Height

1 użytkowników online, w tym zalogowanych: 0, gości: 1