What happened to the Messenger Plus! forums on msghelp.net?
Shoutbox » MsgHelp Archive » Messenger Plus! for Live Messenger » Scripting » CommonDialog help

CommonDialog help
Author: Message:
Matti
Elite Member
*****

Avatar
Script Developer and Helper

Posts: 1646
Reputation: 39
31 / Male / Flag
Joined: Apr 2004
RE: CommonDialog help
Heh, I could have seen that one coming. Well, have a look at my implementation of matty's code, used in my own script.

Some usage examples:
jscript code:
//Open File Dialog
//Opens C:\ first, file filters are text files (*.txt) and all files (*.*)
pm = BrowseForFile("Browse for PM", "C:\\", "Text Files (*.txt)|*.txt|All files (*.*)|*.*||");

//Save File Dialog
//Opens C:\ first, file filters are PNG files (*.png) and all files (*.*)
var file = BrowseForFile("Save picture as", "C:\\", "PNG Files (*.png)|*.png|All files (*.*)|*.*||", true);
if(!file) {
   //User didn't specify a file to save to or pressed Cancel.
} else {
   //User specified a valid save location. Do something useful here.
}
And here's the implementation:
jscript code:
/* FUNCION: BrowseForFile
    Original code by Choli from the Messenger Plus! Translator script
    Desc: Opens a "Browse for file" dialog with the given settings
    Parameters:
        title      Dialog title
        dir        Start directory
        filter     Filter message. Example: "JavaScript file|*.js|Text file|*.txt||"
        save       True is "Save as", false is "Open"
        ext        Default extension to append to the filename when no extension is specified
        file       File to display as default
        hwnd_owner Handle of the owner window, used to copy window icon etc.
    Return value: File path to open or save to
*/
function BrowseForFile(title, dir, filter, save, ext, file, hwnd_owner) {
    save = (save == true);
    hwnd_owner = 1*hwnd_owner;
    var OFN_ALLOWMULTISELECT = 0x200;
    var OFN_ENABLESIZING = 0x800000;
    var OFN_EXPLORER = 0x80000;
    var OFN_FILEMUSTEXIST = 0x1000;
    var OFN_HIDEREADONLY = 0x4;
    var OFN_LONGNAMES = 0x200000;
    var OFN_PATHMUSTEXIST = 0x800;
    var OFN_OVERWRITEPROMPT = 0x2;

    var OpenFileName = Interop.Allocate(88);

    with (OpenFileName) {
        WriteDWORD(0, Size); // lStructSize
        WriteDWORD(4, hwnd_owner); // hwndOwner
        WriteDWORD(8, 0); // hInstance
        if(typeof filter !== "string") filter = "All files (*.*)|*.*||";
        var s_filter = Interop.Allocate(2 * (filter.length + 1));
        WriteMultiStringW(s_filter, filter);
        WriteDWORD(12, s_filter.DataPtr); // lpstrFilter
        WriteDWORD(16, 0); // lpstrCustomFilter
        WriteDWORD(20, 0); // nMaxCustomFilter
        WriteDWORD(24, 1); // nFilterIndex
        if(typeof file !== "string") file = "";
        var s_file = Interop.Allocate(2 * (1024 + 1));
        s_file.WriteString(0, file);
        WriteDWORD(28, s_file.DataPtr); // lpstrFile
        WriteDWORD(32, (s_file.Size / 2 - 1)); // nMaxFile
        WriteDWORD(36, 0); // lpstrFileTitle
        WriteDWORD(40, 0); // nMaxFileTitle
        if(typeof dir === "string") {
            var s_dir = Interop.Allocate(2 * (dir.length + 1));
            s_dir.WriteString(0, dir);
            WriteDWORD(44, s_dir.DataPtr); // lpstrInitialDir
        }
        if(typeof title === "string") {
            var s_title = Interop.Allocate(2 * (title.length + 1));
            s_title.WriteString(0, title);
            WriteDWORD(48, s_title.DataPtr); // lpstrTitle
        }
        WriteDWORD(52, OFN_ENABLESIZING | OFN_EXPLORER | OFN_HIDEREADONLY | OFN_LONGNAMES | OFN_PATHMUSTEXIST | (save ? OFN_OVERWRITEPROMPT : OFN_FILEMUSTEXIST)); // flags
        WriteWORD(56, 0); // nFileOffset
        WriteWORD(58, 0); // nFileExtension
        if(typeof ext === "string") {
            var s_ext = Interop.Allocate(2 * (ext.length + 1));
            s_ext.WriteString(0, ext);
            WriteDWORD(60, s_ext.DataPtr);
        } else WriteDWORD(60, 0); // lpstrDefExt
        WriteDWORD(64, 0); // lCustData
        WriteDWORD(68, 0); // lpfnHook
        WriteDWORD(72, 0); // lpTemplateName
        WriteDWORD(76, 0); // pvReserved
        WriteDWORD(80, 0); // dwReserved
        WriteDWORD(84, 0); // FlagsEx
    }
    var result = Interop.Call("comdlg32.dll", (save ? "GetSaveFileNameW" : "GetOpenFileNameW"), OpenFileName);
    var s_return = false;
    if (result) {
        var p_path = s_file.ReadString(0);
        var p_files = new Array();
        var p_file = "";
        var pos = 2 * (p_path.length + 1);
        if(!save) {
            while(true) {
                p_file = s_file.ReadString(pos);
                if(p_file.length > 0) {
                    p_files.push(p_file);
                    pos += 2 * (p_file.length + 1);
                } else break;
            }
        }
        s_return = (p_files.length > 0) ? new Array(p_path).concat(p_files) : p_path;

    }
    OpenFileName.Size = 0;
    s_filter.Size = 0;
    s_file.Size = 0;
    s_dir.Size = 0;
    return s_return;

    function WriteMultiStringW (datablock, string) {
        var pos = 0;
        datablock.WriteString(0, string);
        pos = string.indexOf("|", pos);
        while (pos !== -1) {
            datablock.WriteWORD(2 * pos, 0);
            pos = string.indexOf("|", pos + 1);
        }
    }
    function Space (number) {
        var i;
        var s = "";
        for (i = 0; i < number; i++) {
            s += " ";
        }
        return s;
    }
}

This post was edited on 11-24-2008 at 07:42 PM by Matti.
Plus! Script Developer | Plus! Beta Tester | Creator of Countdown Live | Co-developer of Screenshot Sender 5

Found my post useful? Rate me!
11-24-2008 07:38 PM
Profile E-Mail PM Web Find Quote Report
« Next Oldest Return to Top Next Newest »

Messages In This Thread
CommonDialog help - by Otacon on 11-24-2008 at 06:46 PM
RE: CommonDialog help - by MeEtc on 11-24-2008 at 06:57 PM
RE: CommonDialog help - by Matti on 11-24-2008 at 06:59 PM
RE: CommonDialog help - by Otacon on 11-24-2008 at 07:12 PM
RE: CommonDialog help - by Matti on 11-24-2008 at 07:38 PM
RE: CommonDialog help - by Otacon on 11-24-2008 at 07:57 PM
RE: CommonDialog help - by matty on 11-24-2008 at 08:03 PM
RE: CommonDialog help - by Otacon on 11-24-2008 at 08:16 PM
RE: CommonDialog help - by Spunky on 11-24-2008 at 08:48 PM
RE: CommonDialog help - by matty on 11-24-2008 at 09:20 PM
RE: CommonDialog help - by Otacon on 11-24-2008 at 09:23 PM
RE: CommonDialog help - by Matti on 11-25-2008 at 05:20 PM
RE: CommonDialog help - by Otacon on 11-25-2008 at 06:02 PM
RE: CommonDialog help - by matty on 11-25-2008 at 06:27 PM
RE: CommonDialog help - by Otacon on 11-25-2008 at 06:29 PM
RE: CommonDialog help - by CookieRevised on 04-11-2011 at 07:51 AM


Threaded Mode | Linear Mode
View a Printable Version
Send this Thread to a Friend
Subscribe | Add to Favorites
Rate This Thread:

Forum Jump:

Forum Rules:
You cannot post new threads
You cannot post replies
You cannot post attachments
You can edit your posts
HTML is Off
myCode is On
Smilies are On
[img] Code is On