[ ghost2k3 @ 13.02.2009. 17:36 ] @
C#

Imam openFileDialog i zelim da kada se on otvori, neki fajlovi vec budu selektovani.
Nasao sam na netu kako da selektujem sve fajlove
Code:
SendMessage(listviewHandle, 0x0111/*WM_COMMAND*/, (uint)0x00017021, (uint)0);


Onda sam takodje nasao da bi sa ovim dole kodom trebao da se selektuje item sa indexom 1,medjutim to se ne desava. SendMessage ne vraca lb_err, nego 0.
Code:
SendMessage(listviewHandle, 0x0185/*LB_SETSEL*/, true, 1);




[Ovu poruku je menjao ghost2k3 dana 13.02.2009. u 21:14 GMT+1]
[ dusty @ 14.02.2009. 05:07 ] @
A kako si nasao hendl za ListView ? Mozda da je tu greska. Moras da uzmes hendl prozora dialoga pa da iteriras kroz njegove child kontrole dok ne nadjes ListView.
[ ghost2k3 @ 14.02.2009. 08:19 ] @
Ovako ide primer za selektovanje svih itema:

Code:
protected override void WndProc(ref Message m)
       {
             // Leting the Form take care off all messages.
            base.WndProc(ref m);

            if (m.Msg == 289) // Notify of message loop
            {
                uint dialogHandle = (uint)m.LParam; // Handle of the file dialog

                if (dialogHandle != m_lastDialogHandle) // Only when not already changed
                {
                    // Getting the handle of the ListBox in the OpenFileDialog dialog.
                    uint listviewHandle = FindWindowEx(dialogHandle, 0,
                    "SHELLDLL_DefView", "");

                    // Sending message to the ListBox to set the view to Thumbnails
                    //Icons=0x7029, List=0x702b, Details=0x702c, Thumbnails=0x702d,
                    //Tiles = 0x702e;
                    SendMessage(listviewHandle, 0x0111/*WM_COMMAND*/, (uint)0x702b, 0);

                    // Sending message to the ListBox to select all items.
                    uint retval = SendMessage(listviewHandle, 0x0111/*WM_COMMAND*/, (uint)0x00017021, (uint)0);
                    
                    // Remember last handle
                    m_lastDialogHandle = dialogHandle;

                }
           }


Na isti nacin i ja uzimam handle, samo sto mu saljem drugaciju poruku sa drugacijim parametrima.

Posle sam probao u test aplikaciji (form, button, listview) da handle uzmem sa listView.Handle, medjutim ni tada ne radi.

[Ovu poruku je menjao ghost2k3 dana 14.02.2009. u 09:31 GMT+1]
[ dusty @ 14.02.2009. 11:24 ] @
Hmmm, vidim gde je greska Ti ListView-u saljes poruku koja je za listbox ! I ja sam se isto zatracao .... uglavnom, pogledaj ovo http://www.devnewsgroups.net/g...rk.windowsforms/topic4250.aspx
[ ghost2k3 @ 14.02.2009. 12:55 ] @
Evo bas probavam taj primer sto si mi poslao

Code:
public partial class Form1 : Form
    {
        IntPtr h;
        int index = -1;

        private const long LVIS_STATEIMAGEMASK = 0xF000;
        private const long LVIS_UNCHECKED = 0x1000;
        private const long LVIS_CHECKED = 0x2000;
        private const long LVIF_STATE = 0x8;
        private const long LVM_FIRST = 0x1000;
        private const long LVM_SETITEMSTATE = (LVM_FIRST + 43);
        private const long LVIS_SELECTED = 0x2000;

        public Form1()
        {
            InitializeComponent();
            this.listView1.HideSelection = true;
            this.listView1.MultiSelect = true;
            h = this.listView1.Handle;
        }

        public struct LVITEM
        {
            public long mask;
            public long iItem;
            public long iSubItem;
            public long state;
            public long stateMask;
            public string pszText;
            public long cchTextMax;
            public long iImage;
            public long lParam;
            public long iIndent;
        }

        [DllImport("user32.dll")]
        private static extern uint SendMessage(IntPtr Hdc, long Msg_Const, int wParam, IntPtr lParam);


        private void button1_Click(object sender, EventArgs e)
        {
            LVITEM lvItem = new LVITEM();
            lvItem.mask = LVIF_STATE;
            lvItem.stateMask = LVIS_STATEIMAGEMASK;
            lvItem.state = LVIS_SELECTED;
            IntPtr pointer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(LVITEM)));
            Marshal.StructureToPtr(lvItem, pointer, true);
            SendMessage(h, LVM_SETITEMSTATE, index, pointer);
            Marshal.FreeHGlobal(pointer);
        }
    }


Javlja mi sledecu gresku u redu gde je SendMessage(...):
"Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
Sad kontam da ovaj pointer nije dobar, ali ne znam kako nije dobar, deluje mi sve ok odradjeno.

Elem, poenta citave price je da kada se prikaze OpenFileDialog, neki itemi vec budu selektovani u oknu gde se nalazi lista dokumenata. E sad ako znas neki drugi nacin da se to realizuje, moze, ne mora to ovako da ide.
[ dusty @ 14.02.2009. 14:02 ] @
Tja, nista pametno mi ne pada na pamet, ali da probas sa unsafe kodom ? Nesto kao:
Code:

//deo koda pre poziva SendMessage
unsafe{
  fix(void *p = pointer.ToPointer()){
    SendMessage(h, LVM_SETITEMSTATE, index, p);
  }
}
//pa ostatak


Jedan fajl mozes preko property-a FileName da postavis, ali za vise ne znam
Sigurno neko ima elegantnije resenje.
[ ghost2k3 @ 14.02.2009. 20:18 ] @
Pda, da su samo ostavili set za FileNames :) ...
[ ghost2k3 @ 23.03.2009. 14:18 ] @
Inace resio sam ovo. Moze sa send message, ali nisam koristio poruke za select item, nego za klik misa na odredjenu lokaciju. Znaci send message da mi vrati lokaciju itema, pa onda send msg za ctrl pa send msg za mouse klik i tako redom :) Ako ih ima vise, pa se ne vide u jednom oknu, onda moras i da uradis skrol, pa opet ista procedura.