|
Install a keyboard hook using the SetWindowsHook function (there are many articles here on CodeProject on how to do this).
Save all the characters you receive into a buffer.
When the last x chars are your word, use the keybd_event or SendInput functions to simulate backspaces and then your word.
This should work.
Another approach would be to get the handle of the current active window the user is typing in. When you have the handle you can get and set its text.
So get the text, look for the string, replace it, and set the controls text.
-Dominik
|
|
|
|
|
Hi, there:
I am trying to use MSChart to visualize some performance data.
But found out that the program only works fine on the machine
with MSVC installed.
Could anyone kindly tell me how to make a smallest installation
so that I can make other machine without MSVC see tha right
MSChart? (How to install the OCX to another machine?)
Thanks a lot in advnace
|
|
|
|
|
How does one change the desktop image in code? I would like to write a program that makes a desktop image containing the ip address of my system.
I have found what I think is the right value in the registry. I just need to be able to refresh the desktop to so the changes take effect.
Cheers,
Clint
|
|
|
|
|
This code gets the key, checks for a certain bitmap, loads the correct one, and then tiles it. Hope this helps
lResult = RegCreateKeyEx(HKEY_CURRENT_USER,
"Control Panel\\Desktop",
0,
"",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKeyResult,
&dwDisposition);
if (lResult != ERROR_SUCCESS){
printf("Houston we have a problem\n");
}
lResult = RegQueryValueEx( hKeyResult,
"Wallpaper",
NULL,
&Type,
(unsigned char*)cTmpData, // address of data buffer
&cbData );
//
// If the background is NOT the correct one, then change the background
// to the appropriate one
//
if (strstr(cTmpData, "mypic.bmp") == NULL) {
//strcpy(cBuff,cXvision);
if (getenv("SystemDrive") != NULL)
sprintf(cBuff,"%s\\iux\\icons\\Amdatabg.bmp",getenv("SystemDrive"));
else
strcpy(cBuff,"C:\\icons\\mypic.bmp");
printf("background wallpaper is %s\n",cTmpData);
printf("should be %s\n",cBuff);
lResult = RegSetValueEx(hKeyResult,
"Wallpaper",
0,
REG_EXPAND_SZ,
(unsigned char*)cBuff,
lstrlen(cBuff));
if (lResult != ERROR_SUCCESS){
printf("Flordia we have a problem\n");
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
lResult,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
cBuff,
255,
NULL );
printf("error is %s\n",cBuff);
}
//
// now tile the wallpaper
//
strcpy(cBuff,"1");
printf("now tileing the wallpaper\n");
lResult = RegSetValueEx(hKeyResult,
"TileWallpaper",
0,
REG_SZ,
(unsigned char*)cBuff,
lstrlen(cBuff));
if (lResult != ERROR_SUCCESS){
printf("Flordia we have a problem\n");
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
lResult,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
cBuff,
255,
NULL );
printf("error is %s\n",cBuff);
}
}
Dan Willis
|
|
|
|
|
Thanks, I haven't tried it out yet but will it automatically update the background or do I need to restart the system? I would also assume that I woulnd't set "TileWallpaper" if I didn't want that option, but rather just show the image centered.
Cheers,
Clint
|
|
|
|
|
I don't remember off hand. You'll have to check on that
Dan Willis
|
|
|
|
|
Off the top of my head (no copy of MSDN kicking about) i think u should be able to use the API SystemParametersInfo
Should work something like:
<br />
if( SystemParametersInfo( SPI_SETDESKWALLPAPER, 0, ( PVOID ) TEXT( "background.bmp" ), SPIF_SENDCHANGE | SPIF_UPDATEINIFILE ) == TRUE )<br />
{
<br />
}<br />
|
|
|
|
|
How Do i programmatically select a specific row in the MSFLexgrid ?
|
|
|
|
|
Hi Maak!
Thank you for the code it works but... with an error..
First!
Could you tell me what "index++;"
"index = index < 4 ? index : 0;"
means???, the "index++" i understand, but the "index = index < 4 ? index : 0;" i don't...
Second!
I change a bit the code like...
.............................
index++;
index = index < 10 ? index : 0;
if (index == 9)
{
index = 1;
}
.............................
I think you understand...
it displays 8 bitmaps again and again with a loop!
The problem is: if i press the button several times
and i see the bitmaps from the beginning then a messagebox is displayed:
" this program has performed an illegal operation ...........", you know!
Then another message box "Unhandled exception.....0xC0000005. Access violation!"
What's wrong.....
|
|
|
|
|
Take a look at the ? operator
saying
index = (index < 10) ? a : b;
if (index < 10)
index = a;
else
index = b;
So its a quick short hand form of an if/else
As to your other problem, not too sure...
Roger Allen
Sonork 100.10016
Were you different as a kid? Did you ever say "Ooohhh, shiny red" even once? - Paul Watson 11-February-2003
|
|
|
|
|
|
Dennis L wrote:
index = index < 4 ? index : 0;
Time to revisit your C/C++ book. This is the ternary operator, which is basically an "inline if statement". It's equivalent to:
if (index < 4)
index = index;
else
index = 0;
In this case it would have been clearer to just say:
if (index >= 4)
index = 0;
Regards,
Alvaro
The world is a dangerous place, not because of those who do evil, but because of those who look on and do nothing. -- Albert Einstein
|
|
|
|
|
Thanks for the explanation!
But What is that error i refered to before???
|
|
|
|
|
That's OK!
I fixed the problem....
I forgot to free() something..
Thanks Anyway!
|
|
|
|
|
Hi,
I have problems getting the Open/Save as common dialogs of an application to work under NT4. The project was compiled under Win2k/XP and VC++ 7.0, and the associated deployment project has detected all dependencies among the .msm packages, and installs them sucessfully in the target computer.
Does anybody knows the trick? Any suggested idea is welcome.
Thanks
|
|
|
|
|
What's the exact problem you're getting? Have you called the CommDlgExtendedError function to see what the error is?
Regards,
Alvaro
The world is a dangerous place, not because of those who do evil, but because of those who look on and do nothing. -- Albert Einstein
|
|
|
|
|
I have met the same problem.
I have searched the help but never found any clue.
I really would be very happy if someone had a solution.
|
|
|
|
|
Hi All,
I've read that you are able to EXPORT functions out of a .exe file and be able to treat them as a dll, being able to Use LoadLibrary, GetProcAddress, and FreeLibrary to access info there.
My problem is that I am able to load the .exe just fine and get a handle to it, I'm then able to successfully get the pointer to the exported function.
My problem is that the data ALWAYS comes out NULL The data I'm trying to get is the compile date and compile time for the exe. I'm really stumped here and have no idea why the information isn't coming back.
Any help, suggestions, comments or insight is greatly appreciated.
Thanks alot!
Dan Willis
|
|
|
|
|
groover4life wrote:
My problem is that the data ALWAYS comes out NULL The data I'm trying to get is the compile date and compile time for the exe. I'm really stumped here and have no idea why the information isn't coming back.
How are you retrieving this data? How does the EXE hold this data? Can you show us some code?
Regards,
Alvaro
The world is a dangerous place, not because of those who do evil, but because of those who look on and do nothing. -- Albert Einstein
|
|
|
|
|
Sure I can.. Here's the code in the EXE that holds the info I want to get:
char *compile_time = __TIME__;
EXPORT char *get_compile_time()
{
return compile_time;
}
with the define in the exe's header being:
EXPORT char *get_compile_time();
Now here is how I'm trying to access it (I left out some garbage in the middle but this is the guts of it):
typedef LPSTR (CALLBACK* LPFNDLLFUNC1)();
hToDLL = LoadLibrary(app);
// If the app doesn't exist, then forgettaboutit
if (hToDLL == NULL) return NULL;
lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hToDLL,"get_compile_time");
if (lpfnDllFunc1 != NULL)
{
// call the function
strResult = lpfnDllFunc1();
if (strResult == NULL) {
err = GetLastError();
return NULL;
}
}
That's how it's being done. I'm doing it in 20 Dlls and I'm having no problems there, the problem only occurrs when I'm loading an exe. The strResult comes back NULL.
Thanks!
Dan Willis
|
|
|
|
|
Hmmmm, I've actually done something similar to this, but not using LoadLibrary. I've linked the DLL with the LIB file from the EXE. So when the DLL is loaded it also loads the EXE, but since the EXE is already running -- the EXE brings up the DLL with LoadLibrary -- then it uses that instance of the EXE instead of loading a separate one.
In your case I'm not really sure of the problem, but it appears as though loading the EXE this way does not load its global variables. Your compile_time variable is global. This may be the root of the problem.
Try doing this instead:
EXPORT char *get_compile_time()
{
return __TIME__;
}
Regards,
Alvaro
The world is a dangerous place, not because of those who do evil, but because of those who look on and do nothing. -- Albert Einstein
|
|
|
|
|
Alvaro Mendez wrote:
Try doing this instead:
EXPORT char *get_compile_time(){ return __TIME__;}
Yeah, I tried doing that as well. I also tried all the types (int,float,double,etc) and also tried returning the information via a pointer on one of the "in" parameters. Still did not work. I also tried running the application and then tried loading it while the exe was running, and that still didn't work.
Alvaro Mendez wrote:
but it appears as though loading the EXE this way does not load its global variables. Your compile_time variable is global. This may be the root of the problem.
My guess is the same. The LoadLibrary function just isn't loading the global variables. But if I make a local anything and try:
return "I am confused";
It still will return a NULL pointer.
So the global memory space still doesn't quite apply based on those tests. Got a Humdinger here. Any other ideas? I'm flat out. I'm looking around for more info on how the global stuff is handled when an app is loaded using LoadLibrary, but I'm not having much luck.
Does anyone have any ideas? Even some insight on the matter? Please help if you can. I really appreciate it.
Dan Willis
|
|
|
|
|
OK, I'm gonna give it a shot. How did you define your EXPORT macro?
Regards,
Alvaro
The world is a dangerous place, not because of those who do evil, but because of those who look on and do nothing. -- Albert Einstein
|
|
|
|
|
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif
That's how it's defined. Thanks I really appreciate the help.
Dan Willis
|
|
|
|
|
OK, just tried it and it's working fine, even with the global variable!
I put your code into a little EXE (Doodle.exe), compiled it, and then copied it to a second EXE with a different name (Doodle2.exe). Here's the code:
char* compiler_time = __TIME__;
extern "C" __declspec (dllexport) char* get_compile_time()
{
return compiler_time;
}
void CDoodleDlg::OnButtonCallExe()
{
typedef LPSTR (CALLBACK* LPFNDLLFUNC1)();
HINSTANCE hToDLL = LoadLibrary("Doodle2.exe");
if (hToDLL == NULL)
{
AfxMessageBox("Failed to load the app.");
return;
}
LPFNDLLFUNC1 lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hToDLL, "get_compile_time");
if (lpfnDllFunc1 != NULL)
{
char* strResult = lpfnDllFunc1();
if (strResult == NULL)
AfxMessageBox("WTF!");
}
}
Are you sure it's your strResult that comes back NULL and not your lpfnDllFunc1? By the way, I couldn't define the EXPORT macro since MFC already defines it.
Regards,
Alvaro
The world is a dangerous place, not because of those who do evil, but because of those who look on and do nothing. -- Albert Einstein
|
|
|
|
|