Я занимаюсь разработкой приложения с использованием C #, имеющего аналогичные функции копирования, вставки, как в Windows.
Я добавил пункты меню и связал с соответствующими приложениями.
Пожалуйста, посмотрите на следующее изображение, чтобы получить больше идей.
Элементы, добавленные в меню оболочки http://softwaregenius.net/myimages/menu.jpg
Подобно тому, как мы выбираем несколько элементов в проводнике Windows, вам нужно выбрать несколько файлов и / или папок, а затем выбрать ОС Util-> FastCopy. Форма открывается, как показано ниже
Форма показана на FastCopy http://softwaregenius.net/myimages/fastcopy1.jpg
Приложение работает отлично. Основная проблема здесь заключается в том, что после выбора файлов все эти файлы открываются в соответствующих программах. То есть, если я выбрал документ Word, тогда имя файла добавляется в форму FastCopy, но также открывается и в Word.
Когда я исследовал, я обнаружил, что эта проблема связана с SendMessage. Я должен использовать PostMessage вместо SendMessage. Но когда я это делаю, приложение не работает.
Ниже приведено описание моей основной функции в C # 2005
static class Program
{
static Mutex mutex = new Mutex(true, "{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE92}");
[STAThread]
static void Main(string[] args)
{
string fileName = "";
if (args.Length > 0)
{
fileName = args[0];
}
if (mutex.WaitOne(TimeSpan.Zero, true))
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
frmFastCopy frm = new frmFastCopy();
frm.AddItemToList(fileName);
Application.Run(frm);
}
else
{
//The following message is sent just to show up the form
NativeMethods.PostMessage(
(IntPtr)NativeMethods.HWND_BROADCAST,
NativeMethods.WM_SHOWME,
IntPtr.Zero,
IntPtr.Zero);
//Send the filename
SendFileName(fileName);
}
}
static void SendFileName(string s)
{
Win32.CopyDataStruct cds = new Win32.CopyDataStruct();
cds.cbData = (s.Length + 1) * 2;
cds.lpData = Win32.LocalAlloc(0x40, cds.cbData);
Marshal.Copy(s.ToCharArray(), 0, cds.lpData, s.Length);
cds.dwData = (IntPtr)1;
Win32.SendMessage((IntPtr)NativeMethods.HWND_BROADCAST, Win32.WM_COPYDATA, IntPtr.Zero, ref cds);
//NativeMethods.PostMessage((IntPtr)NativeMethods.HWND_BROADCAST, Win32.WM_COPYDATA, cds.lpData, IntPtr.Zero);
}
}
}
Ниже приведена копия WndProc и другого кода из формы
открытый частичный класс frmFastCopy: Form
{
делегат void AddItemToListDelegate (строка itm);
public frmFastCopy()
{
InitializeComponent();
}
public void AddItemToList(string itm)
{
if (lvFilesAndFolders.InvokeRequired)
{
AddItemToListDelegate m = new AddItemToListDelegate(AddItemToList);
this.Invoke(m, new object[] { itm });
}
else
{
lvFilesAndFolders.Items.Add(itm);
}
}
protected override void WndProc(ref Message m)
{
if (m.Msg==NativeMethods.WM_SHOWME)
{
ShowMe();
}
if (m.Msg==Win32.WM_COPYDATA)
{
//string s = Marshal.PtrToStringUni(m.LParam);
MessageBox.Show("Got message");
Win32.CopyDataStruct st = (Win32.CopyDataStruct)Marshal.PtrToStructure(m.LParam, typeof(Win32.CopyDataStruct));
string strData = Marshal.PtrToStringUni(st.lpData);
AddItemToList(strData);
}
base.WndProc(ref m);
}
private void ShowMe()
{
this.Show();
if (WindowState == FormWindowState.Minimized)
{
WindowState = FormWindowState.Normal;
}
// get our current "TopMost" value (ours will always be false though)
bool top = TopMost;
// make our form jump to the top of everything
TopMost = true;
// set it back to whatever it was
TopMost = top;
}
Вот класс NativeCode
internal class NativeMethods
{
public const int HWND_BROADCAST = 0xffff;
public static readonly int WM_SHOWME = RegisterWindowMessage("WM_SHOWME");
[DllImport("user32")]
public static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam);
[DllImport("user32")]
public static extern int RegisterWindowMessage(string message);
}
Я знаю, что вы, ребята, гениальны. Может кто-нибудь сказать мне, где я должен внести изменения, чтобы выбранные файлы были открыты или, скорее, как я должен использовать postmessage.
Спасибо, что поделились своим драгоценным временем.
Привет
Ирфан