Reassign / Remap Power Button to Application - 8125, K-JAM, P4300, MDA Vario General

To start, I should note that notifications drive me NUTS with WM5. Regardless if I am running the OEM rom on my KJAM or the QTEK AKU2 rom, notifications are not reliabe when the device is in standby. Sounds seem to work sometimes, but not always. Vibrate is sketchy at best. The only thing that seems to always work is the LED, which is really useless for me because I keep the device in my pocket 99% of the time. :x
So...I was thinking what is the point of standby mode anyway? How much power does it really save? GPRS is always on and the OS is obviously running in the background. So today, I installed MortSaver and used that to simply put the device in screen saver mode instead of using the power button for standby. What were my findings? No noticeable change in battery life whatsoever for me! And of course the best part is that since the device basically just has it's screen off, I get all my notifications and alerts as expected.
BUT, I don't want to sacrifice a hardware button for this, so I'm wondering if anyone knows how to remap the power button to an application. I want to unbind it from the OS and make it launch MortSaver...seems like it should be easy, but so far I can find no way to make this happen. Anyone have an idea :?:

Would also like to be able to do this...any suggestions?

hey guys,
yesterday i droped my qtek 9100 on the floor and now my power button does not work, i cannot turn it off
im looking forward how to remap ON/OFF button to another hard button.

Well, a poweroff utility isn't too complex:
#include <windows.h>
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
::keybd_event(VK_OFF, 0, 0, 0);
::keybd_event(VK_OFF, 0, KEYEVENTF_KEYUP, 0);
return 0;
}
You must put the attached exe in Windows\Start Menu\Programs and you can assign it to any button in the Settings->Buttons dialog.

Related

tip: how to vibrate

Code:
#include <windows.h>
#include <nled.h>
// from the platform builder <Pwinuser.h>
extern "C" {
BOOL WINAPI NLedGetDeviceInfo( UINT nInfoId, void *pOutput );
BOOL WINAPI NLedSetDevice( UINT nDeviceId, void *pInput );
};
void LedOn(int id)
{
NLED_SETTINGS_INFO settings;
settings.LedNum= id;
settings.OffOnBlink= 1;
NLedSetDevice(NLED_SETTINGS_INFO_ID, &settings);
}
void LedOff(int id)
{
NLED_SETTINGS_INFO settings;
settings.LedNum= id;
settings.OffOnBlink= 0;
NLedSetDevice(NLED_SETTINGS_INFO_ID, &settings);
}
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
for (int i=0 ; i<10 ; i++)
{
LedOn(1);
Sleep(400);
LedOff(1);
Sleep(200);
}
return 0;
}
led '0' is the radio led
led '1' is the vibrator
Thanks for this tip!
I was just looking for a way to make the phone vibrate. We're doing applications for the deaf community so vibration is absolutely necessary!
/Christer
With settings.LedNum=0 i can do the things with the Radio LED.
But my MDA 2 has a third LED for Bluetooth. And when i query Device Info i get a count of two(starting at 0). But i canĀ“t do something with the 3rd LED. Somebody knows why?
I also would like to know hot the let the first LED flash green and not Red?
Ok this thread is ancient, but I am resurrecting it to ask a relevant question. This is the method that I am currently using to vibrate. The problem is that when the cpu is being used for other tasks, this will tend to make it vibrate longer than expected. For instance if I switch screen orientation and they try this the vibration will be longer because other threads are doing some processing. The following:
LedOn(1);
Sleep(400);
LedOff(1);
is not a reliable method because if the CPU is busy more than 400ms may elapse between the two calls. Sometimes a lot more. Is it possible to use the blink mode for the vibrator, as in using 2 for the OffOnBlink value as in this msdn article?
http://msdn.microsoft.com/en-us/library/ms905326.aspx
So far all I can get it to do is vibrating without stopping. Any help would be appreciated. Thanks.
JKingDev said:
Ok this thread is ancient, but I am resurrecting it to ask a relevant question. This is the method that I am currently using to vibrate. The problem is that when the cpu is being used for other tasks, this will tend to make it vibrate longer than expected. For instance if I switch screen orientation and they try this the vibration will be longer because other threads are doing some processing. The following:
LedOn(1);
Sleep(400);
LedOff(1);
is not a reliable method because if the CPU is busy more than 400ms may elapse between the two calls. Sometimes a lot more. Is it possible to use the blink mode for the vibrator, as in using 2 for the OffOnBlink value as in this msdn article?
http://msdn.microsoft.com/en-us/library/ms905326.aspx
So far all I can get it to do is vibrating without stopping. Any help would be appreciated. Thanks.
Click to expand...
Click to collapse
actually putting the thread to sleep is kinda not recommended, i usually create another thread to vibrate and set it to sleep then stop the vibration and exit the thread.
maybe i can create a class for that, but it will be a C# class, not C++
anaadoul said:
actually putting the thread to sleep is kinda not recommended, i usually create another thread to vibrate and set it to sleep then stop the vibration and exit the thread.
maybe i can create a class for that, but it will be a C# class, not C++
Click to expand...
Click to collapse
I am not exactly sure what you mean by this. Do you do the exact same thing but all in another thread? Or do you start the vibration, create a new thread that just sleeps then stop the vibration when the thread returns? I got even worse results when trying it all in another thread.
Is there no other way to do this than start vibration then stop it after sleeping? There is no way to give it the duration you want?

[REQ]Remapping Camera shot key to volume button?

Hi there,
First of all I tried searching on google and also in this forum itself but I cant find anything related and so i decided to create a new thread on this.
If there anyway via tweaking the registry that i can make use of the volume key on the blackstone to take pictures instead of using the touchscreen? I believe this is possible
I find taking picture using a touchscreen is really difficult.
I read from http://wiki.xda-developers.com/index.php?pagename=HTC_Blackstone_Overview that this is possible by remapping the volume rocker.
Does any know how?
Will anyone be able to help?
I'm requesting this also. HTC should have made an option for us to choose for this from the beginning.
Request also here!
Sorry, I added this "remap volume rocker Solution" because I thought it was possible, but I actually didn't try it. So let's keep this thread to find a way to do it.
Remapping keys is through AE Button Plus or MobileMagic.
Right now we only have the choice of "touch" or "touch and hold" the virtual on-screen button to "auto-focus + shot".
We need to find out if there is any keyboard shortcut associated to that function.
I tried to use the "enter key" fonction remaped to Volume Up with AE Button Plus, but it didn't work.
Does the HTC Touch Pro have HTC's Camera application? maybe they know a keyboard shortcut? Let's ask.
I guess it will be possible.... just that we need the experts here to show us how to...
[APP] CameraButton
To solve this problem. I thought of a very simple solution:
Instead of us clicking the on-screen camera button, we need an application "CameraButton", which will click on the screen for us, then we just need to map a hardware button to that application.
Simple isn't it?
So here is the C# code for the CameraButton application:
Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
namespace CameraButton
{
class Program
{
[System.Runtime.InteropServices.DllImport("coredll.DLL", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
public static extern IntPtr FindWindow(string lpClassName,string lpWindowName);
[System.Runtime.InteropServices.DllImport("coredll.DLL", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
static extern bool SetForegroundWindow(IntPtr hWnd);
[System.Runtime.InteropServices.DllImport("coredll.dll")]
static extern bool SetCursorPos(int X, int Y);
[System.Runtime.InteropServices.DllImport("coredll.dll")]
static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, int dwExtraInfo);
[Flags]
public enum MouseEventFlags
{
LEFTDOWN = 0x00000002,
LEFTUP = 0x00000004,
MIDDLEDOWN = 0x00000020,
MIDDLEUP = 0x00000040,
MOVE = 0x00000001,
ABSOLUTE = 0x00008000,
RIGHTDOWN = 0x00000008,
RIGHTUP = 0x00000010
}
static void Main(string[] args)
{
IntPtr cameraHandle;
cameraHandle = FindWindow(null, "Camera");//search camera app
if (cameraHandle == IntPtr.Zero)// cannot find it then launch it
{
Process cam = Process.Start(new ProcessStartInfo("Camera.exe", ""));
//cameraHandle = cam.MainWindowHandle;
}
else // can find it then set position then click
{
//SetForegroundWindow(cameraHandle);// we assume we already have the focus on the camera app
SetCursorPos(240, 750 );//set position to the on-screen camera button
mouse_event((uint)MouseEventFlags.LEFTDOWN, 0, 0, 0, 0);
mouse_event((uint)MouseEventFlags.LEFTUP, 0, 0, 0, 0);
}
}
}
}
Why do I give the code rather than the binary?
Because unfortunately this code doesn't work (yet).
Let me explain a bit more:
This application doesn't need to keep running in the background, it just can do 2 things. Start the camera app if it's not already started, or just click at a specifically chosen position.
If I set the position to (0,0), my program will click at the upper-left corner of the screen, and hit the start button, therefore the start menu appears.
However if I try to click on the camera application, it doesn't have any effect!
Actually if I click somewhere else than the on-screen camera button, it should still react to the click: the little cross should move to the clicked place as part of the Touch Focus feature of HTC's camera app.
But here again, nothing happen.
Since it's my first app on WiMo, I might have done a mistake somewhere, but I can't see where.
Any XDA-developer can spot what's wrong with my code?
please see http://forum.xda-developers.com/showthread.php?t=471321
The Problem is the HTC Application, it blocks any keydown event
I did it Application released soon!
http://www.scilor.com/leocameraanykey.html

WM Tactile/Haptic feedback API

Does anyone know how to invoke the tactile feedback from an app. Specifically, I am writing my own keyboard but i would like to generate the little pulses when my virtual keys are pressed. I cant find anything on how to actually do this. presumably it's just one system call.
I have a HTC touch pro 2, so i want to get it working on this at first.
thanks for any help,
You just have to vibrate the phone for a very small time, around 20-50ms.
I don't think there's an API for "haptic feedback", it's just a vibration.
It is just touch-vibrate like you said
Just a tip:
The vibration motor is like the led on your device to handle.
Also the vibration/led id is different on different devices!
Hi,
That's what i was thinking too. I'm going to try the WM Vibrate/VibrateGetDeviceCaps/VibrateStop functions to see if they will do it.
If anyone knows if there's more too it than this, please advise.
thanks,
Unfortunately the Vibrate API does not work. These smartphones are actually pocketPC which doesnt support the API.
Intead i use the NLED interface with led=1. This seems to work to create a basic pulse, but i dont know of any way to adjust the strength of the pulse or even if that's possible.
this is what im doing:
Code:
static void LedOn(int id)
{
NLED_SETTINGS_INFO settings;
settings.LedNum= id;
settings.OffOnBlink= 1;
NLedSetDevice(NLED_SETTINGS_INFO_ID, &settings);
}
static void LedOff(int id)
{
NLED_SETTINGS_INFO settings;
settings.LedNum= id;
settings.OffOnBlink= 0;
NLedSetDevice(NLED_SETTINGS_INFO_ID, &settings);
}
static void key_hepatic_feedback()
{
LedOn(1);
Sleep(20);
LedOff(1);
}
No, the strength isn't adjustable. You can only control the duration.

[Q] HW Button, Finger Gesture, Bluetooth & input panel for HTC HD2

Help...!! I'm new with WM developing,
There are 4 questions I'm about to ask about HTC HD2 using WM6.5:
1. How to disable hardware function and handle their event 'on press' for every HW button (such as Home, Window, Talk, End and Back button)?
So far, I just able to disable it using :
[DllImport("coredll.dll")]
private static extern bool UnregisterFunc1(KeyModifiers modifiers, int keyID);
[DllImport("coredll.dll", SetLastError = true)]
public static extern bool RegisterHotKey(IntPtr hWnd, // handle to window
int id, // hot key identifier
KeyModifiers Modifiers, // key-modifier options
int key //virtual-key code
);
Buttons that I can successfully disable are Volume Up, Volume Down, Back, and Talk.
There is no way I can handle or disable Windows, Home and end button.
I have a trick by disable Window button:
IntPtr hTaskBar = FindWindow("HHTaskBar", null);
EnableWindow(hTaskBar, false);
But when I try to lock and unlock the screen using end button, Window button function will not disable anymore.
So far, some forums mention about SHCMBM_OVERRIDEKEY and handle the message by using Microsoft.WindowsCE.Forms.MessageWindow,
and again I still don't know how to attach MessageWindow to my foreground application
2. I'd like if my panel finger gesture behavior works as well as ListView or DataGrid. So, I found a library that can help me.
code.msdn.microsoft.com/gestureswm/Release/ProjectReleases.aspx?ReleaseId=3146
Unfortunatelly, it makes my controls in panel flicker badly. Do you have any other alternative?
3. To handle bluetooth, I'm using
[DllImport("BthUtil.dll")]
public static extern int BthGetMode(out BluetoothMode dwMode);
[DllImport("BthUtil.dll")]
public static extern int BthSetMode(BluetoothMode dwMode);
and InTheHand.Net Library to send data.
But since I'm starting with this device, I even cannot deactive the Bluetooth.
Can you help me with this Bluetooth control and data communication?
4. Since I'm using virtual keyboard as my input, How to define what kind of input panel it will show?
For Example, if my Textbox1 is focused, I have to show Numeric Keypad.
But if Textbox2 is focused, I have to show Qwerty keyboard.
Thank you very much.
PS : I'm using C# for developing the application. It'll be very good if you give me a C# example for those questions.
I know this is a few months old, and I don't wanna ressurect it per-say - and i'm not farmiliar with the rules as it relates to posting on these forums, but i've been viewing them forever, and as a member for a few months at least, and i've got to say that disabling the END key is a must for the HTC HD2, especially for Android NAND. At present with my phone, and thousands of others, everytime we press the END button, the screen stops being responsive. Funny thing is, if i NEVER press the end button, my screen works great. I end calls using the screen, and i've installed 'Button Saviour' from the market to use the 'END' button virtually on-screen, and I wake the phone using any of the other 4 buttons, save for 'END', and i get no problems. It's the Damned signal sent to the screen from the END button that causes the screen to disable and never re-enable the digitizer - I am just supposing these things, I'm in no way or shape a developer... Just something to think about?
This could be the end to thousands of HTC HD2 end user issues relating to lockscreen lock up in Android or otherwise...

keycode_headsethook "not working"

Hi!
I've made a simple app that needs to catch mic button click from wired headset, and I tried to implement that via simple onKeyDown function in activity, and also with broadcastreciever, but app doesn't react on click. Or to be precise it doesn't react on some generic android phone with android 4.2, while working perfecty fine on ZTE Blade III. It does however react on other keys like Volume Up/Down. I was thinkg that maybe builtin apps have even greater priorty then my app, but don't know hot to check that, and more importantly how to prevent that, (priority of 100000 didin't help) . Also to mention that phone is registering button for recieve call, so it doesn't look like it's a hw problem.
dkovacev said:
Hi!
I've made a simple app that needs to catch mic button click from wired headset, and I tried to implement that via simple onKeyDown function in activity, and also with broadcastreciever, but app doesn't react on click. Or to be precise it doesn't react on some generic android phone with android 4.2, while working perfecty fine on ZTE Blade III. It does however react on other keys like Volume Up/Down. I was thinkg that maybe builtin apps have even greater priorty then my app, but don't know hot to check that, and more importantly how to prevent that, (priority of 100000 didin't help) . Also to mention that phone is registering button for recieve call, so it doesn't look like it's a hw problem.
Click to expand...
Click to collapse
Could you show us your onKeyDown implementation? That would certainly help. I'm guessing you have a certain keyCode you are checking in that method, it could be as simple as that the 4.2 device just has it configured differently so the keycode passed to onKeyDown is different. Just put a Log.d("myApp", "Pressed key with code: "+keycode); in there and see if you get any logs.
If the whole method isn't called, it might be that some view in the activity is consuming the key event, as indicated in the documantation. It is also possible that the onKeyDown isn't called at all for you keycode.
Thanks for the interest, code is simple
Code:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Toast.makeText( this, "BUTTON pressed!", Toast.LENGTH_SHORT).show();
String myStr = "";
if ((keyCode == KeyEvent.ACTION_DOWN)){
Toast.makeText( this, "BUTTON down", Toast.LENGTH_SHORT).show();
}
if ((keyCode == KeyEvent.KEYCODE_HEADSETHOOK)){
Toast.makeText( this, "BUTTON Headset key Down!", Toast.LENGTH_SHORT).show();
}
if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)){
Toast.makeText( this, "BUTTON volume Down!", Toast.LENGTH_SHORT).show();
}
...
As you can guess, nothing happens even before 'if statements', VOLUME_UP works fine, same thing happens in onKeyUp function.
I also tried with broadcast recievers, copy/pasted sample from SDK (Random Music Player) that works with Broadcast Recievers, still nothing.
Button itself, works for recieving calls, but nowhere else, I read somewhere that with JellyBean Google introduced Media control with mic button for play/pause functionality in music player, but it won't work for me, when I press buttton during playback, volume is up, while holding, and that's it.
And still, same code works perfectly fine on 4.0.4, maybe it's something with this particular 4.2.2 that prevents me from capturing key, but don't know how and where to look about it
dkovacev said:
Thanks for the interest, code is simple
Code:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Toast.makeText( this, "BUTTON pressed!", Toast.LENGTH_SHORT).show();
String myStr = "";
if ((keyCode == KeyEvent.ACTION_DOWN)){
Toast.makeText( this, "BUTTON down", Toast.LENGTH_SHORT).show();
}
if ((keyCode == KeyEvent.KEYCODE_HEADSETHOOK)){
Toast.makeText( this, "BUTTON Headset key Down!", Toast.LENGTH_SHORT).show();
}
if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)){
Toast.makeText( this, "BUTTON volume Down!", Toast.LENGTH_SHORT).show();
}
...
As you can guess, nothing happens even before 'if statements', VOLUME_UP works fine, same thing happens in onKeyUp function.
I also tried with broadcast recievers, copy/pasted sample from SDK (Random Music Player) that works with Broadcast Recievers, still nothing.
Button itself, works for recieving calls, but nowhere else, I read somewhere that with JellyBean Google introduced Media control with mic button for play/pause functionality in music player, but it won't work for me, when I press buttton during playback, volume is up, while holding, and that's it.
And still, same code works perfectly fine on 4.0.4, maybe it's something with this particular 4.2.2 that prevents me from capturing key, but don't know how and where to look about it
Click to expand...
Click to collapse
Ah ok, so it doesn't even get called :/ Then I would probably try to use the broadcastReceiver again, did you do it like this (its a different question but the code looks fine)? I think it's better to use a receiver anyway since it is not connected to the activity or the views in it.

Categories

Resources